简言

vue3的指令是其核心内容之一,在此做下总结。directives
指令是带有 v- 前缀的特殊 attribute。Vue 提供了许多内置指令,例如:v-bind、v-html等。

指令

vue的指令就是以v-为前缀的属性,他期望的值大部分是js表达式(除v-for、v-slot、v-on),作用是在表达式值改变后响应式的更新dom。

介绍

下面是官网中的较为经典的一张图,他表明了指令有 name(名)、argument(参数)、modifiers(修饰符)、value(值)四部分组成。
在这里插入图片描述

name 名称

name就是指令的名称,书写时带v-前缀,例如:v-on是on指令、v-if是if指令、v-for是for指令。

arguments 参数

某些指令会需要一个“参数”,在指令名后通过一个冒号隔开做标识。例如用 v-bind 指令来响应式地更新一个 HTML attribute:

<a v-bind:href="url"> ... </a>

<!-- 简写 -->
<a :href="url"> ... </a>

这里 href 就是一个参数,它告诉 v-bind 指令将表达式 url 的值绑定到元素的 href attribute 上。在简写中,参数前的一切 (例如 v-bind:) 都会被缩略为一个 : 字符。

另一个例子是 v-on 指令,on指令的参数就是各种事件,它将监听 DOM 事件:

<a v-on:click="doSomething"> ... </a>

<!-- 简写 -->
<a @click="doSomething"> ... </a>

这里的参数是要监听的事件名称:click。v-on 有一个相应的缩写,即 @ 字符。

除了是静态参数外,也可以是动态参数,使用一个字符串变量,并使方括号将其包裹:

<a v-bind:[attributeName]="url"> ... </a>

attributeName是个变量,假如,值为’bar’,则 v-bind:bar=“url”。

modifiers修饰符

修饰符是以点开头的特殊后缀,表明指令需要以一些特殊的方式被绑定。例如 .prevent 修饰符会告知 v-on 指令对触发的事件调用 event.preventDefault():

<form @submit.prevent="onSubmit">...</form>

vue3的修饰符有很多,大部分分为两种:v-model修饰符事件修饰符

v-model修饰符
  • .lazy — 加 lazy 修饰符来改为在每次 change 事件后更新数据。
  • .number ----- 输入内容转数字。
  • .trim — 去除两端空格。
事件修饰符
修饰符描述
.stop单击事件将停止传递,停止捕获冒泡, 相当于event.stopPropagation
.prevent阻止默认行为。相当于event.preventDefault()
.self仅当 event.target 是元素本身时才会触发事件处理器
.capture添加事件监听器时,使用 capture 捕获模式
.once点击事件最多被触发一次
.passive提高事件性能,事件的默认行为 (scrolling) 将立即发生而非等待,相当于事件监听器的第三个参数的passive:true
按键修饰符Vue 为一些常用的键盘按键和鼠标按键提供了别名,例如: .enter、.up、.down、.tab、.esc、.right、.middle等。
<!-- 单击事件将停止传递 -->
<a @click.stop="doThis"></a>

<!-- 提交事件将不再重新加载页面 -->
<form @submit.prevent="onSubmit"></form>

<!-- 修饰语可以使用链式书写 -->
<a @click.stop.prevent="doThat"></a>

<!-- 也可以只有修饰符 -->
<form @submit.prevent></form>

<!-- 仅当 event.target 是元素本身时才会触发事件处理器 -->
<!-- 例如:事件处理器不来自子元素 -->
<div @click.self="doThat">...</div>
<!-- 添加事件监听器时,使用 `capture` 捕获模式 -->
<!-- 例如:指向内部元素的事件,在被内部元素处理前,先被外部处理 -->
<div @click.capture="doThis">...</div>

<!-- 点击事件最多被触发一次 -->
<a @click.once="doThis"></a>

<!-- 滚动事件的默认行为 (scrolling) 将立即发生而非等待 `onScroll` 完成 -->
<!-- 以防其中包含 `event.preventDefault()` -->
<div @scroll.passive="onScroll">...</div>
<!-- 仅在 `key` 为 `Enter` 时调用 `submit` -->
<input @keyup.enter="submit" />
<input @keyup.page-down="onPageDown" />
<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />

<!-- Ctrl + 点击 -->
<div @click.ctrl="doSomething">Do something</div>
<!-- 当按下 Ctrl 时,即使同时按下 Alt 或 Shift 也会触发 -->
<button @click.ctrl="onClick">A</button>

<!-- 仅当按下 Ctrl 且未按任何其他键时才会触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>

<!-- 仅当没有按下任何系统按键时触发 -->
<button @click.exact="onClick">A</button>

内置指令

vue内置了许多指令供使用。

指令描述
v-text文本指令,更新元素的文本内容,v-text 通过设置元素的 textContent 属性来工作,因此它将覆盖元素中所有现有的内容。
v-htmlhtml指令,更新元素的 innerHTML。
v-show基于表达式值的真假性,来改变元素的可见性。v-show 通过设置内联样式的 display CSS 属性来工作,当元素可见时将使用初始 display 值。当条件改变时,也会触发过渡效果。
v-ifif指令,基于表达式值的真假性,来条件性地渲染元素或者模板片段。当 v-if 元素被触发,元素及其所包含的指令/组件都会销毁和重构。如果初始条件是假,那么其内部的内容根本都不会被渲染。
v-else表示 v-if 或 v-if / v-else-if 链式调用的“else 块”。不能单独使用,上面兄弟元素必须是v-if或v-else-if
v-else-if表示 v-if 的“else if 块”。可以进行链式调用。不能单独使用,上面兄弟元素必须是v-if或v-else-if
v-forfor循环指令
v-on事件指令。缩写 @
v-bind动态绑定指令,动态的绑定一个或多个 attribute,也可以是组件的 prop。缩写 :
v-model在表单输入元素或组件上创建双向绑定。
v-slot用于声明具名插槽或是期望接收 props 的作用域插槽。缩写 #
v-pre跳过该元素及其所有子元素的编译。
v-once仅渲染元素和组件一次,并跳过之后的更新。
v-memo3.2+版本, 缓存指令, 为了实现缓存,该指令需要传入一个固定长度的依赖值数组进行比较。如果数组里的每个值都与最后一次的渲染相同,那么整个子树的更新将被跳过。
v-cloak用于隐藏尚未完成编译的 DOM 模板。

结语

详情内容可参考vue3官网。

Logo

前往低代码交流专区

更多推荐