React中dangerouslySetInnerHTML实现dom插入Html代码
场景
当用富文本编辑好内容保存到数据库之后,数据库存的富文本的内容格式如下:
1 | <div><h1>标题</h1><main>内容</main></div> |
当需要在某个页面某个位置去展示它的话需要原样展示出来,要怎么办呢?
解决方案
解决方案有两种:
- 使用
useRef
获取dom元素之后使用innerHTML
属性去吧html代码插入到dom元素中去,具体如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import React, { useEffect, useRef } from "react";
function App() {
const dom = useRef(null);
useEffect(()=>{
if(dom.current){
dom.current.innerHTML = '<h2>标题2</h2>'
}
},[])
return (
<div ref={dom}></div>
)
} - 使用react在dom上新增的一个属性dangerouslySetInnerHTML,官方文档介绍:
dangerouslySetInnerHTML
是 React 为浏览器 DOM 提供innerHTML
的替换方案。通常来讲,使用代码直接设置 HTML 存在风险,因为很容易无意中使用户暴露于跨站脚本(XSS)
的攻击。因此,你可以直接在 React 中设置 HTML,但当你想设置dangerouslySetInnerHTML
时,需要向其传递包含 key 为__html
的对象,以此来警示你。
下面不用官方例子了,用本文章的例子:1
2
3
4
5
6
7
8
9
10
11
12
13import React, { useState, useEffect } from "react";
function App() {
const [htmlContent,setHtmlContent] = useState('')
useEffect(()=>{
setHtmlContent('<h2>标题2</h2>')
},[])
return (
<div dangerouslySetInnerHTML={{__html:htmlContent}}></div>
)
}这个用法更加安全一些。
相关博客
-
2020-10-30
-
2021-07-08
-
2022-05-11
-
2020-12-15
-
2021-07-01