v-html指令用于更新元素的innerHTML。其内容按普通HTML插入,不会作为Vue模板进行编译。
Mustache语法(双大括号)会将数据解释为普通文本,而非HTML代码。为了输出真正的HTML,需要使用v-html指令。
提示: 不能使用v-html来复合局部模板,因为Vue不是基于字符串的模板引擎。反之,对于用户界面(UI),组件更适合作为可重用和可组合的基本单位。
例如想要输出一个a标签,首先需要在data属性中定义该标签,然后根据需要定义href属性值和标签内容,再使用v-html绑定到对应的元素上。
【例4.6】输出真正的HTML(源代码\ch04\4.6.html)。
<div id="app"> <!—简单的文本插值--> <h2>{{ website}}</h2> <!—输出HTML代码--> <h2 v-html="website"></h2> </div> <!--引入vue文件--> <script src="https://unpkg.com/vue@next"></script> <script> //创建一个应用程序实例 const vm= Vue.createApp({ //该函数返回数据对象 data(){ return{ website:'<a href="https://www.baidu.com">百度</a>' } } //在指定的DOM元素上装载应用程序实例的根组件 }).mount('#app'); </script>
在谷歌浏览器中运行程序,按F12键打开控制台,并切换到 “Elements”选项,可以发现使用v-html指令的p标签输出了真正的a标签。当单击“百度”按钮后,页面将跳转到对应的页面,效果如图4-9所示。
图4-9 输出真正的HTML
从结果可知,Mustache语法不能作用在HTML特性上,如果需要控制某个元素的属性,可以使用v-bind指令。
注意: 在网站上动态渲染任意HTML是非常危险的,因为容易导致XSS攻击。只在可信内容上使用v-html,禁止在用户提交的内容上使用v-html指令。