一、什么是自定义指令
vue官方提供很多指令,如:v-model,v-show,v-if,v-if等,他们都以v-开头。当这些指令不能满足我们实际开发需求时,我们还可以自定义指令。自定义指令主要分为全局自定义指令和局部自定义指令。
二、全局自定义指令directive
在main.js中写全局自定义指令
1 2 3 4 5 6 |
|
// vue3 写法 这是一个 Vue 插件对象。当通过
app.use()
使用该插件时,会自动调用install
方法// 定义插件
const AuthorityPlugin = {
install(app) {
// 注册一个叫 v-focus
的指令
app.directive('focus
', {
mounted:(el, binding)=> {
el.focus()
}
});
}
};// 在 main.js 中使用插件
app.use(AuthorityPlugin);
三、局部自定义指令directives
可以在任意组件中定义自定义指令,directives是一个对象,他的每一个属性就只一个自定义指令,这里定义了一个focus指令。
1 2 3 4 5 6 7 |
|
四、自定义指令的调用
和普通指令的使用方式一样v-自定义指令名称
如 v-focus
五、自定义指令
有以下五个钩子函数:
-
bind
:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 -
inserted
:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中) vue2。 -
mounted:当指令绑定的元素插入到其父节点中的时候调用。注意这里的描述与 Vue 2 中的
inserted
钩子功能相同 vue3。 -
update
:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。 -
componentUpdated
:指令所在组件的 VNode 及其子 VNode 全部更新后调用。 -
unbind
:只调用一次,指令与元素解绑时调用。
每个钩子函数有以下参数:
- el:指令所绑定的元素,可以用来直接操作 DOM。
- binding:一个对象,包含以下 property:
- name:指令名,不包括 v- 前缀。
- value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
- oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
- expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
- arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
- modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
- vnode:Vue 编译生成的虚拟节点。
- oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
钩子应用场景
-
bind: 初始化数据或者配置。
-
inserted: 添加DOM操作,例如添加第三方库所需的元素属性 vue2 钩子。
-
mounted:
当指令绑定的元素插入到其父节点中的时候调用。注意这里的描述与 Vue 2 中的inserted
钩子功能相同 vue3 钩子。 -
update: 根据新的值更新DOM,适合需要响应式更新的场景。
-
componentUpdated: 在所有相关联的DOM更新完成后进行调整,避免在更新过程中出现不完整的状态。
-
unbind: 清理工作,如解除事件绑定或清除定时器等。
通过这些钩子函数,你可以非常灵活地控制自定义指令的行为和生命周期,实现各种复杂的交互效果和功能。
注意:bind和insert都只调用一次;bind在insert前执行,也就是bind在dom树绘制前调用,insert在dom树绘制后调用;涉及dom操作的,我们一般都用insert,如自动获取焦点指令,只能用insert函数
六、自定义指令传参
1 |
|
可以用binding.arg去接收" : "后的参加参数,这里传递了data1这个变量,data1必须用[]包裹,否则就是‘data1’这个字符串,[ ]中只能传递一个变量,多个变量可以用对象或数组组装。binding.value去接收"="后的参数,这里是个函数所以用bingding.value()去调用。
1 2 3 4 5 6 7 8 9 10 |
|
七、常见自定义指令
1、拖拽
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
2、防抖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
八. 应用场景
8.1 自动获取焦点(官方示例)
1 2 3 4 5 6 7 8 |
|
8.2 一键 Copy的功能
- 首先建一个 js 文件(v-copy.js)。定义一个对象。( 指令实际就是一个对象 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|