指令
指令
v-html
更新元素的 innerHTML
期望的绑定值类型:string
详细信息
v-html的内容直接作为普通 HTML 插入— Vue 模板语法是不会被解析的。如果你发现自己正打算用v-html来编写模板,不如重新想想怎么使用组件来代替安全警告
在网站上动态渲染任意 HTML 是非常危险的,因为这非常容易造成 XSS 攻击。请仅在内容安全可信时再使用
v-html,并且永远不要使用用户提供的 HTML 内容示例
<template> <div> <p>使用双大括号,HTML 会被转义:</p> <div>{{ rawHtml }}</div> <p>使用 v-html 指令,HTML 会被渲染:</p> <div v-html="rawHtml"></div> </div> </template> <script> export default { data() { return { rawHtml: '<span style="color: red;">这是一个红色的文字!</span>' } } } </script>运行结果:
第一个
<div>会显示文本:<span style="color: red;">这是一个红色的文字!</span>第二个
<div>会显示一个红色的文字:这是一个红色的文字!
参考模板语法 - 原始 HTML
v-bind
动态的绑定一个或多个 attribute,也可以是组件的 prop
缩写:
:或者.(当使用.prop/.attr修饰符)值可以省略 (当 attribute 和绑定的值同名时,需要 3.4+ 版本)
期望:
any (带参数) | Object (不带参数)参数:
attrOrProp (可选的)修饰符:
.camel- 将短横线命名的 attribute 转变为驼峰式命名.prop- 强制绑定为 DOM property (3.2+).attr- 强制绑定为 DOM attribute (3.2+)用途:
当用于绑定
class或styleattribute,v-bind支持额外的值类型如数组或对象,详见下方的参考链接在处理绑定时,Vue 默认会利用
in操作符来检查该元素上是否定义了和绑定的 key 同名的 DOM property。如果存在同名的 property,则 Vue 会将它作为 DOM property 赋值,而不是作为 HTML attribute 设置。这个行为在大多数情况都符合期望的绑定值类型,但是你也可以显式用.prop和.attr修饰符来强制绑定方式首先需要理解 HTML attribute 和 DOM property 的区别:
HTML attribute<div id="my-div" class="container" data-value="123"></div>是 HTML 标记中的特性/属性
在 HTML 源码中定义
始终是字符串类型
大小写不敏感(HTML标准)
DOM propertyconst div = document.getElementById('my-div'); console.log(div.id); // "my-div" - property console.log(div.className); // "container" - property是 DOM 对象上的属性
在 JavaScript 中访问
可以是任何 JavaScript 数据类型
大小写敏感
Vue 使用
in操作符来检查元素是否有同名的 DOM property:if (key in element) { // 作为 DOM property 设置 element[key] = value; } else { // 作为 HTML attribute 设置 element.setAttribute(key, value); }示例说明默认行为:
<template> <div> <!-- value 既是 HTML attribute 也是 DOM property --> <input v-bind:value="inputValue" /> <!-- data-id 不是标准的 DOM property --> <div v-bind:data-id="itemId"></div> <!-- title 既是 HTML attribute 也是 DOM property --> <span v-bind:title="tooltip"></span> </div> </template> <script> export default { data() { return { inputValue: 'hello', itemId: '123', tooltip: '提示信息' } } } </script>实际绑定结果:
value:作为 DOM property 设置(input.value = 'hello')data-id:作为 HTML attribute 设置(div.setAttribute('data-id', '123'))title:作为 DOM property 设置(span.title = '提示信息')显式修饰符
.prop修饰符 - 强制作为 DOM Property<template> <div> <h3>不同的内容设置方式:</h3> <!-- 方式1:文本插值(默认) --> <div>内容:{{ content }}</div> <!-- 方式2:v-html(渲染HTML) --> <div v-html="content"></div> <!-- 方式3:textContent property(设置纯文本) --> <div :text-content.prop="content"></div> </div> </template> <script> export default { data() { return { content: '<span style="color: red">红色文字</span>' } } } </script>方式1:
内容:<span style="color: red">红色文字</span>方式2:红色文字
方式3:
<span style="color: red">红色文字</span><template> <div> <!-- 传递复杂数据到自定义组件 --> <user-card :user-data.prop="userInfo"></user-card> <!-- 传递简单的字符串属性 --> <user-card user-name.attr="张三"></user-card> </div> </template> <script> export default { data() { return { userInfo: { name: '李四', age: 25, address: { city: '北京', street: '长安街' } } } } } </script>方式 设置的是什么 HTML结果 显示效果 用途 :text-content.propDOM property <div></div><span style="color: red">红色文字</span>设置纯文本内容 :text-contentHTML attribute <div text-content="..."></div>(空) 设置自定义属性 {{ content }}文本插值 <div><span...></div><span style="color: red">红色文字</span>显示转义文本 v-htmlinnerHTML <div><span style="color: red">红色文字</span></div>红色文字 渲染HTML .attr修饰符 - 强制作为 HTML Attribute<template> <div> <!-- 强制作为 HTML attribute --> <input :value.attr="inputValue" /> <!-- 即使元素有同名 DOM property 也作为 HTML attribute --> <div :title.attr="tooltip"></div> <!-- 自定义数据属性 --> <div :data-info.attr="jsonData"></div> </div> </template> <script> export default { data() { return { inputValue: 'test', tooltip: '提示信息', jsonData: '{"id": 1, "name": "test"}' } } } </script><div> <!-- 强制作为 HTML attribute --> <input value="test" /> <!-- 即使元素有同名 DOM property 也作为 HTML attribute --> <div title="提示信息"></div> <!-- 自定义数据属性 --> <div data-info="{"id": 1, "name": "test"}"></div> </div>当用于组件 props 绑定时,所绑定的 props 必须在子组件中已被正确声明
<template> <div> <h3>子组件</h3> <p>标题: {{ title }}</p> <p>数量: {{ count }}</p> <p>是否禁用: {{ disabled }}</p> </div> </template> <script> export default { // 必须在这里声明所有接受的 props props: { title: String, count: { type: Number, default: 0 }, disabled: { type: Boolean, default: false } } } </script><template> <div> <h3>父组件</h3> <!-- 正确:绑定的 props 已在子组件中声明 --> <ChildComponent :title="pageTitle" :count="itemCount" :disabled="isDisabled" /> <!-- 错误:someUndefinedProp 未在子组件中声明 --> <!-- 这会触发 Vue 警告 --> <ChildComponent :some-undefined-prop="value" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { pageTitle: '页面标题', itemCount: 5, isDisabled: true, value: 'some value' } } } </script>示例
<!-- 绑定 attribute --> <img v-bind:src="imageSrc" /> <!-- 动态 attribute 名 --> <button v-bind:[key]="value"></button> <!-- 缩写 --> <img :src="imageSrc" /> <!-- 缩写形式的动态 attribute 名 (3.4+),扩展为 :src="src" --> <img :src /> <!-- 动态 attribute 名的缩写 --> <button :[key]="value"></button> <!-- 内联字符串拼接 --> <img :src="'/path/to/images/' + fileName" /> <!-- class 绑定 --> <div :class="{ red: isRed }"></div> <div :class="[classA, classB]"></div> <div :class="[classA, { classB: isB, classC: isC }]"></div> <!-- style 绑定 --> <div :style="{ fontSize: size + 'px' }"></div> <div :style="[styleObjectA, styleObjectB]"></div> <!-- 绑定对象形式的 attribute --> <div v-bind="{ id: someProp, 'other-attr': otherProp }"></div> <!-- prop 绑定。“prop” 必须在子组件中已声明。 --> <MyComponent :prop="someThing" /> <!-- 传递子父组件共有的 prop --> <MyComponent v-bind="$props" /> <!-- XLink --> <svg><a :xlink:special="foo"></a></svg>参考
v-if
待更新