vue 指令 v-xxx
v-text
<span v-text="msg"></span>
<!-- 等同于 -->
<span>{{msg}}</span>
v-html
v-html 的内容直接作为普通 HTML 插入—— Vue 模板语法是不会被解析的。如果你发现自己正打算用 v-html 来编写模板,不如重新想想怎么使用组件来代替。
如果你想让 v-html 的内容也支持 scoped CSS,你可以使用 CSS modules 或使用一个额外的全局 <style>
元素,手动设置类似 BEM 的作用域策略。
<div v-html="html"></div>
v-show
v-show 通过设置内联样式的 display CSS 属性来工作,当元素可见时将使用初始 display 值。当条件改变时,也会触发过渡效果。
注意display是css属性。不会影响dom树
v-if
当 v-if 元素被触发,元素及其所包含的指令/组件都会销毁和重构。如果初始条件是假,那么其内部的内容根本都不会被渲染。
可用于 <template>
表示仅包含文本或多个元素的条件块。
当条件改变时会触发过渡 效果。
当同时使用时,v-if 比 v-for 优先级更高。我们并不推荐在一元素上同时使用这两个指令
v-else
限定:上一个兄弟元素必须有 v-if 或 v-else-if。
可用于 <template>
表示仅包含文本或多个元素的条件块。
<div v-if="Math.random() > 0.5">Now you see me</div>
<div v-else>Now you don't</div>
v-else-if
限定:上一个兄弟元素必须有 v-if 或 v-else-if。
可用于 <template>
表示仅包含文本或多个元素的条件块。
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not A/B/C</div>
v-for
望的绑定值类型:Array | Object | number | string | Iterable
详细信息
指令值必须使用特殊语法 alias in expression 为正在迭代的元素提供一个别名:
<div v-for="item in items">{{ item.text }}</div>
或者,你也可以为索引指定别名 (如果用在对象,则是键值):
<div v-for="(item, index) in items"></div>
<div v-for="(value, key) in object"></div>
<div v-for="(value, name, index) in object"></div>
v-for 的默认方式是尝试就地更新元素而不移动它们。要强制其重新排序元素,你需要用特殊 attribute key 来提供一个排序提示:
<div v-for="item in items" :key="item.id">{{ item.text }}</div>
v-on
给元素绑定事件监听器。 缩写:@
期望的绑定值类型:Function | Inline Statement | Object (不带参数)
参数:event (使用对象语法则为可选项)
修饰符
.stop - 调用 event.stopPropagation()。
.prevent - 调用 event.preventDefault()。
.capture - 在捕获模式添加事件监听器。
.self - 只有事件从元素本身发出才触发处理函数。
.{keyAlias}
- 只在某些按键下触发处理函数。
.once - 最多触发一次处理函数。
.left - 只在鼠标左键事件触发处理函数。
.right - 只在鼠标右键事件触发处理函数。
.middle - 只在鼠标中键事件触发处理函数。
.passive - 通过 { passive: true }
附加一个 DOM 事件。
详细信息
事件类型由参数来指定。表达式可以是一个方法名,一个内联声明,如果有修饰符则可省略。
当用于普通元素,只监听原生 DOM 事件。当用于自定义元素组件,则监听子组件触发的自定义事件。
当监听原生 DOM 事件时,方法接收原生事件作为唯一参数。如果使用内联声明,声明可以访问一个特殊的 $event 变量:v-on:click="handle('ok', $event)"。
监听子组件的自定义事件 (当子组件的“my-event”事件被触发,处理函数将被调用):
<MyComponent @my-event="handleThis" />
<!-- 内联声明 -->
<MyComponent @my-event="handleThis(123, $event)" />
<!-- 方法处理函数 -->
<button v-on:click="doThis"></button>
<!-- 动态事件 -->
<button v-on:[event]="doThis"></button>
<!-- 内联声明 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- 使用缩写的动态事件 -->
<button @[event]="doThis"></button>
<!-- 停止传播 -->
<button @click.stop="doThis"></button>
<!-- 阻止默认事件 -->
<button @click.prevent="doThis"></button>
<!-- 不带表达式地阻止默认事件 -->
<form @submit.prevent></form>
<!-- 链式调用修饰符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 按键用于 keyAlias 修饰符-->
<input @keyup.enter="onEnter" />
<!-- 点击事件将最多触发一次 -->
<button v-on:click.once="doThis"></button>
<!-- 对象语法 -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
v-on 还支持绑定不带参数的事件/监听器对的对象。请注意,当使用对象语法时,不支持任何修饰符。
v-bind
动态的绑定一个或多个 attribute,也可以是组件的 prop。
缩写:
: 或者 . (当使用 .prop 修饰符) 值可以省略 (当 attribute 和绑定的值同名时)
.camel - 将短横线命名的 attribute 转变为驼峰式命名。
<!-- 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>
v-model
在表单输入元素或组件上创建双向绑定。
期望的绑定值类型:根据表单输入元素或组件输出的值而变化
仅限:
<input>
<select>
<textarea>
components
修饰符
.lazy - 监听 change 事件而不是 input .number - 将输入的合法字符串转为数字 .trim - 移除输入内容两端空格
v-model 可以在组件上使用以实现双向绑定。
从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏:
<!-- Child.vue -->
<script setup>
const model = defineModel();
function update() {
model.value++;
}
</script>
<template>
<div>parent bound v-model is: {{ model }}</div>
</template>
v-slot
<FancyButton>
Click me!
<!-- 插槽内容 -->
</FancyButton>
<button class="fancy-btn">
<slot></slot>
<!-- 插槽出口 -->
</button>
具名插槽
<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
<BaseLayout>
<template v-slot:header>
<!-- header 插槽的内容放这里 -->
</template>
</BaseLayout>
插槽 + 传 props
<MyComponent>
<template #header="headerProps"> {{ headerProps }} </template>
<template #default="defaultProps"> {{ defaultProps }} </template>
<template #footer="footerProps"> {{ footerProps }} </template>
</MyComponent>
<slot name="header" message="hello"></slot>
通过 this.$slots 可以在子组件拿到父组件传来的插槽组件 从而实现更灵活的判断
设置插槽出口时,可以用 v-for 批量设置,节省不必要代码
<template v-for="(_,name) in $slots" #[name]="scopedData">
<slot :name="name" v-bind="scopedData">
</template>
v-once
<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 带有子元素的元素 -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- 组件 -->
<MyComponent v-once :comment="msg" />
<!-- `v-for` 指令 -->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
v-pre
跳过该元素及其所有子元素的编译。
无需传入
元素内具有 v-pre,所有 Vue 模板语法都会被保留并按原样渲染。最常见的用例就是显示原始双大括号标签及内容。
<span v-pre>{{ this will not be compiled }}</span>
v-once
仅渲染元素和组件一次,并跳过之后的更新。
无需传入
在随后的重新渲染,元素/组件及其所有子项将被当作静态内容并跳过渲染。这可以用来优化更新时的性能。
<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 带有子元素的元素 -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- 组件 -->
<MyComponent v-once :comment="msg" />
<!-- `v-for` 指令 -->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
v-memo (3.2+)
缓存一个模板的子树。在元素和组件上都可以使用。为了实现缓存,该指令需要传入一个固定长度的依赖值数组进行比较。如果数组里的每个值都与最后一次的渲染相同,那么整个子树的更新将被跳过。举例来说:
<div v-memo="[valueA, valueB]">...</div>
当组件重新渲染,如果 valueA 和 valueB 都保持不变,这个 div 及其子项的所有更新都将被跳过。实际上,甚至虚拟 DOM 的 vnode 创建也将被跳过,因为缓存的子树副本可以被重新使用。
v-cloak
v-cloak 用于隐藏尚未完成编译的 DOM 模板。
无需传入
详细信息
该指令只在没有构建步骤的环境下需要使用。