You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React:为何Chrome DevTools Elements里HTML内容带双引号?children与dangerouslySetInnerHTML哪个是最佳实践?

问题描述

我正在使用Next.js搭建博客。
当我将文本作为children传入组件时,为什么Chrome DevTools的Elements面板中显示的HTML内容带有双引号?
普通children写法代码:

<h1>hello world tes {props.title}</h1>

运行效果:
效果示意图
而通过dangerouslySetInnerHTML写入内容时,就没有出现双引号:

<h1 dangerouslySetInnerHTML={{ __html: `hello world tes ${props.title}`}} />

运行效果:
效果示意图
请问children和dangerouslySetInnerHTML二者哪一种是最佳实践?


解答

双引号的出现原因

这个双引号仅为Chrome DevTools的调试展示标记,不会真实出现在页面渲染结果中:

  • 普通children写法下,React会将JSX中的静态文本、动态插值拆分为独立的文本节点渲染,DevTools为了区分静态文本和动态生成的文本内容,会自动给动态文本节点加上双引号标识,仅在Elements面板可见,用户实际浏览、复制内容、搜索引擎爬取都不会获取到额外引号。
  • dangerouslySetInnerHTML是直接将拼接完成的整段字符串作为HTML内容注入,整段内容为单个文本节点,因此DevTools不会追加额外标识。

最佳实践选择

优先使用普通children写法,仅在必要场景下使用dangerouslySetInnerHTML:

  • 普通children写法下React默认开启XSS防护,会自动转义动态内容中的恶意HTML、JS代码,安全性更高,同时写法符合JSX语法规范,支持组件嵌套、事件绑定等特性,可维护性更强。
  • dangerouslySetInnerHTML本身存在XSS攻击风险,仅当你需要渲染可信的HTML片段(比如经过安全过滤的后台富文本内容)时再使用,使用前必须对注入内容做严格的安全校验。

内容的提问来源于stack exchange,提问作者R.M. Reza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:08