jtwang7 / React-Note

React 学习笔记
8 stars 2 forks source link

React - dangerouslySetInnerHTML #29

Open jtwang7 opened 3 years ago

jtwang7 commented 3 years ago

React - dangerouslySetInnerHTML

参考:dangerouslySetInnerHTML

前言

HTML5 中,可以通过修改 DOM 对象的 innerHTML 属性,向文档中一次性插入大量的 HTML 元素。innerHTML 属性会接受一个 HTML 字符串,而赋给 innerHTML 属性的字符串会被解析为 DOM 子树,并替代元素之前的所有节点。这也就意味着传给 innerHTML 的字符串中所有的 html 标签都会以浏览器处理 HTML 的方式转换为元素,而没有意义的字符则作为文本形式展示。

dangerouslySetInnerHTML

dangerouslySetInnerHTML 是 React 为浏览器 DOM 提供 innerHTML 的替换方案。 通常来讲,使用代码直接设置 HTML 存在风险,因为很容易无意中使用户暴露于跨站脚本(XSS)的攻击。 因此,你可以直接在 React 中设置 HTML,但当你想设置 dangerouslySetInnerHTML 时,需要向其传递包含 key 为 __html 的对象,以此来警示你。例如:

function createMarkup() {
  return {__html: 'First · Second'};
}

function MyComponent() {
  return <div dangerouslySetInnerHTML={createMarkup()} />;
}

应用

可以借助 innerHTML 解析字符串中的 html 标签:

function MyComponent() {
  return <div dangerouslySetInnerHTML={__html: '<strong>test</strong>test'} />;
}

若不用 innerHTML,则字符串会原封不动的展示为 <strong>test</strong>test,无法实现加粗效果。

注意:应该尽量避免使用 innerHTML,因为 innerHTML 能够轻松将字符串解析为可运行的代码,所以黑客能够以字符串形式恶意注入代码,借助解析,创建元素并执行 onclick 之类的一系列恶意操作 (跨站点脚本)