回首Vue3之指令篇(二)|8月更文挑战

504 阅读2分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

对于v-html指令,我们是不陌生的,如果你读过回首Vue3之指令篇(一)|8月更文挑战,可以类比做些类似的操作;如果没有,那就让我们接着往下看吧。

如何使用

v-html指令是用来更新元素的 innerHTML。注意:内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译。就是把你写的html代码插入到当前指令所在的元素内。

直接使用v-html指令,如下:

//数据
{
    html:"<span>hello world</span>"
}

//使用
<h1 v-html="html"></h1>


//编译后的结果
<h1>
    <span>hello world</span>
</h1>

v-html相对于v-text在项目开发中无疑少了很多或者说很少使用(因人而异,但一般开发使用v-html的场景是比较少的),那么什么场景下我们才会使用呢?欢迎大家评论,说出你使用的场景,以下是我认为可以用到的场景。

  1. 特殊需求,后端给的数据是html字符串并需要我们去渲染
  2. 使用table时,有时我们需要某一项给不用的颜色或者样式显示,这时候我们可以插入一个内联样式标签
  3. 一个标签下,需要展示多种标签,可以使用v-html指令
  4. ......(等你评论)

自定义指令

Vue3中如何自定义一个指令?

上一篇文章我们模拟了一个v-text指令,今天我们来模拟一下v-html指令,我们姑且就称它为v-chtml吧。

<div id="app">
    <h1 v-chtml="html"></h1>
</div>

<script src="../dist/vue.global.js"></script>
<script>
    const { createApp, ref } = Vue
    const app = createApp({
        setup() {
            const html=ref("<span style='color:red'>hello world</span>")
            return {
                html
            }
        }
    })
    // 自定义v-chtml改变当前元素的内容
    app.directive('chtml',{
        mounted(el,{value}){
            el.innerHTML=value;
        }
    })
    app.mount("#app")
</script>

如果你读过回首Vue3之指令篇(一)|8月更文挑战这篇文章,就可以看出,自定义v-chtmlv-ctext指令基本相同,只有细微的差异。

innerHTML

从上述代码中el.innerHTML=value可以看出,我们在替换el的内容时用的是innerHTML。指定的值被解析为 HTML 或 XML(基于文档类型),从而生成一个DocumentFragment对象,表示新元素的新 DOM 节点集。

总结

  1. 官方提示:在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击。只在可信内容上使用 v-html永不用在用户提交的内容上。

  2. v-htmlv-text有很多的相似性,我们可以类比学习,他们所做的本质都是改变当前元素的内容。

想了解更多文章,传送门已开启:回首Vue3目录篇