v-html指令

好的,这是使用 CDN 方式引入 Vue 3 并演示 v-html 指令的代码。

v-html 指令

v-html 用于更新元素的 innerHTML。它的内容会被当作普通的 HTML 解析并插入。


示例代码

这是一个完整的 HTML 文件,您可以直接将其保存为 .html 文件并在浏览器中打开查看效果。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 3 v-html 示例 (CDN)</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            padding: 20px;
            font-size: 1.2rem;
        }
        #app {
            max-width: 600px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid #ddd;
            border-radius: 8px;
        }
        .warning {
            background-color: #fffbe6;
            border: 1px solid #ffe58f;
            padding: 10px;
            border-radius: 4px;
            color: #d46b08;
        }
    </style>
</head>
<body>

<div id="app">
    <h2>v-html 示例</h2>
    
    <div v-html="rawHtml"></div>

    <hr style="margin: 20px 0;">

    <h2>普通文本插值 (v-text 或 {{}})</h2>
    <div>{{ rawHtml }}</div>
    
    <hr style="margin: 20px 0;">

    <div class="warning">
        <p><strong>安全警告:</strong></p>
        <p v-html="warningMessage"></p>
    </div>

</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

<script>
    // 2. 创建 Vue 应用
    const { createApp, ref } = Vue;

    const app = createApp({
        setup() {
            // 3. 定义一个包含 HTML 标签的字符串
            const rawHtml = ref('<span style="color: red;">这是一个红色的 span 标签</span><br><strong>这是加粗的文本。</strong>');

            const warningMessage = ref('在你的网站上动态渲染任意 HTML 是非常危险的,因为它很容易导致 <a href="https://zh.wikipedia.org/zh-cn/跨網站指令碼" target="_blank">XSS 攻击</a>。请只在内容安全可靠的情况下使用 `v-html`,并且<strong>永远不要</strong>用它来渲染用户提交的内容。');

            return {
                rawHtml,
                warningMessage
            };
        }
    });

    // 4. 挂载应用到 #app 元素上
    app.mount('#app');
</script>

</body>
</html>

代码解释

  1. 引入 Vue 3 CDN
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    这行代码从 unpkg CDN 服务加载了 Vue 3。加载后,会创建一个全局的 Vue 对象。

  2. 创建 Vue 应用实例
    const { createApp, ref } = Vue;
    我们从全局的 Vue 对象中解构出 createApp 方法来创建应用,以及 ref 函数来创建响应式数据。

  3. 定义数据
    setup() 函数中,我们定义了一个名为 rawHtml 的响应式引用(ref),它的值是一个包含 HTML 标签的字符串。

  4. 使用 v-html
    <div v-html="rawHtml"></div>
    这行代码是核心。Vue 会将 rawHtml 变量中的字符串解析为 HTML,并将其设置为这个 <div> 元素的内部 HTML 内容。您会看到一个红色的 <span> 标签和一个加粗的 <strong> 标签被正确渲染。

  5. 对比普通插值
    <div>{{ rawHtml }}</div>
    为了对比,我们还展示了如果使用普通的双大括号 {{ }} 插值会发生什么。在这种情况下,HTML 标签会被当作纯文本显示,而不会被浏览器解析。这是 Vue 为了防止 XSS 攻击而采取的默认安全措施。

  6. 挂载应用
    app.mount('#app');
    将我们创建的 Vue 应用挂载到 idapp<div> 元素上。


⚠️ 重要安全警告

v-html 可以很方便地渲染动态 HTML,但也非常危险。如果 v-html 渲染的内容是用户提交的,那么恶意用户可能会注入 <script> 标签或其他恶意代码,从而导致跨站脚本攻击(XSS)

黄金法则:

  • 只在完全信任内容来源的情况下使用 v-html
  • 永远不要将用户输入的内容直接用 v-html 渲染。 如果必须这么做,请务必使用专业的 HTML 清理库(如 DOMPurify)对内容进行严格的过滤和消毒。
Vue.js中,插值表达式(Interpolation)、`v-text`指令和`v-html`指令都用于动态地插入或修改元素的内容。以下是它们的区别: 1. **插值表达式 ({{ expression }})**: 插值表达式是最基本的文本绑定形式。当你在一个模板字符串中包含`{{ expression }}`,Vue会在渲染时替换这个表达式的值。例如: ```html <p>{{ message }}</p> ``` 这里,`message`的数据变化会导致页面上对应位置的文字更新。 2. **v-text 指令 (`<span v-text="text">...</span>` or `{{{ text }}}`)**: `v-text`指令也用来插入文本,但它只适合简单的文本插入,不会进行HTML解析。如果要插入的是带标签的HTML,可能会导致安全问题。例如: ```html <span v-text="safeText"></span> ``` 注意,Vue默认不信任外部数据源,所以`safeText`必须提前处理掉可能导致XSS攻击的内容。 3. **v-html 指令 (`<div v-html="unsafeHtml"></div>`)**: `v-html`指令是用来插入任意HTML内容的,包括script标签和其他可能执行脚本的部分。这通常用于从服务器端获取的不可信数据,因为它是直接解析并嵌入到DOM中的,所以风险较高。使用时要确保数据来源的安全: ```html <div v-html="trustedContent"></div> ``` 如果`trustedContent`不是来自可信赖源,你需要谨慎处理,以防止恶意代码注入。 总结来说: - 插值表达式用于普通文本,易于理解和管理,无安全风险; - `v-text`适合简单的文本插入,对于复杂HTML建议避免使用,以防意外; - `v-html`用于插入完整的HTML,危险但强大,需确保数据安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值