设置原始的HTML:dangerouslySetInnerHTML

本文介绍如何在React中利用dangerouslySetInnerHTML属性安全地插入HTML内容,并给出具体示例代码,展示正确的属性设置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一般我们批量插入一些文章之类的都是直接插入HTML页面的,所以就考虑用到这个属性了

复制代码
var Hello = React.createClass({
        render:function(){
            var htmlSet = {__html: 'First · Second'};
            return (
                <div dangerouslySetInnerHTML={htmlSet} ></div>
            )
        }
    })
    ReactDOM.render(
        <Hello />,
        document.querySelector('#app')
    )
复制代码

有一点非常直接注意的是:

{__html: 'First &middot; Second'} 注意标红的地方是双下划线,这个是必须的语法,请注意否则会报错如下:

Uncaught Error: `props.dangerouslySetInnerHTML` must be in the form `{__html: ...}` 

import React, { useState, useEffect } from 'react'; import DOMPurify from 'dompurify'; // 用于安全净化 HTML,防止 XSS const HtmlEmbedder = () => { // 状态管理:存储 HTML 内容、加载状态、错误信息 const [htmlContent, setHtmlContent] = useState(''); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { // 假设 demo.html 在 public 文件夹下,URL 为 /demo.html const fetchHtmlWithStyles = async () => { try { // 1. 加载 HTML 内容 const htmlResponse = await fetch('/home.html'); if (!htmlResponse.ok) throw new Error('HTML 加载失败'); const htmlText = await htmlResponse.text(); const sanitizedHtml = DOMPurify.sanitize(htmlText); // 2. 解析 DOM 并提取资源 const parser = new DOMParser(); const tempDoc = parser.parseFromString(sanitizedHtml, 'text/html'); // 3. 提取所有 CSS 资源 const extractedResources = []; // 处理 <link> 标签 (外部 CSS) const links = tempDoc.querySelectorAll('link[rel="stylesheet"]'); for (const link of links) { try { const cssResponse = await fetch(link.href); if (!cssResponse.ok) continue; const cssText = await cssResponse.text(); extractedResources.push({ type: 'external', content: cssText, origin: link.href }); link.remove(); // 移除原链接标签 } catch (e) { console.error(`CSS加载失败: ${link.href}`, e); } } // 处理 <style> 标签 (内联 CSS) const styles = tempDoc.querySelectorAll('style'); styles.forEach(style => { extractedResources.push({ type: 'inline', content: style.textContent }); }); // 4. 创建样式合并容器 const styleContainer = document.createElement('style'); styleContainer.textContent = extractedResources .map(res => `/* ${res.type === 'external' ? 'From: ' + res.origin : 'Inline CSS'} */\n${res.content}`) .join('\n\n'); setLoading(false); } catch (err) { setError('加载错误: ' + err.message); setLoading(false); } }; fetchHtmlWithStyles(); }, []); // 空依赖数组确保只运行一次 // 渲染组件 return ( <div> <h2>嵌入外部 HTML 文件</h2> {loading && <p>Loading HTML content...</p>} {error && <p style={{ color: 'red' }}>{error}</p>} {/* 安全渲染 HTML,使用 dangerouslySetInnerHTML */} <div dangerouslySetInnerHTML={{ __html: htmlContent }} /> </div> ); }; export default HtmlEmbedder; 完整的生成html和css并放到return的div中
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值