在Vue中除了核心功能默认的内置指令v-html、v-show外,也允许注册自定义指令。在某些场景下,仍然需要对普通DOM元素进行操作,需要在多个地方使用时,可以使用自定义指令简化代码,提高编程效率。Vue自定义指令有全局注册和局部注册两种方式。
自定义指令的声明方式
全局自定义指令
1
2
3
4
5
6
7
8
9
10
11// 一般写在 main.js 中 /
// directive.js
import Vue from 'vue'
Vue.directive('focus', { // 注册一个全局自定义指令 `v-focus`
inserted: function (el) {
el.focus()
}
})
// main.js 引入
import './directive/directive.js'
// 模板中使用 <input type="text" v-focus>局部自定义指令
1
2
3
4
5
6
7
8
9
10// 在单个 .vue文件中 使用 directives 声明
export default {
directives: { // 注册局部自定义指令
focus: {
inserted: function (el) {
el.focus()
}
}
}
}
自定义指令钩子函数及参数
v-自定义指令名称:参数.修饰符="表达式"
钩子函数
1
2
3
4
5// bind:只调用一次,指令第一次绑定到元素时调用。初始化
// inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
// update:所在组件的 VNode 更新时调用
// componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用
// unbind:只调用一次,指令与元素解绑时调用钩子函数的参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<!-- el: 指令所绑定的元素,可以用来直接操作 DOM -->
<!-- binding: 一个对象 包含: name(指令名) value(指令的绑定值) arg(传给指令的参数) modifiers(指令修饰符) -->
<div v-tips:text.stop="msg">自定义指令</div> <!-- msg: '参数' -->
<script>
export default {
directives: {
tips: {
inserted: function (el, binding) {
console.log(el); // <div>自定义指令</div>
console.log(binding);
/* {
name: 'tips', // 指令名称
arg: 'text', // 传给指令的参数
value:'参数', // 指令的绑定值
modifiers: { stop: true }, // 指令修饰符
} */
}
}
}
}
</script>动态指令参数
v-mydirective:[argument]="value"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<p v-pin:[direction]="200">at 200px to the left.</p>
<script>
export default {
data: function () {
return { direction: 'left' }
}
}
Vue.directive('pin', {
bind: function (el, binding, vnode) {
el.style.position = 'fixed'
var s = (binding.arg == 'left' ? 'left' : 'top')
el.style[s] = binding.value + 'px'
}
})
</script>
Vue3中的自定义指令
1 | // main.js |
v-focus 自动获取焦点
1 | <input type="text" v-focus /> |
v-showTips 封装tips提示
1 | // 简化页面多出用到的 tips 提示信息 |
v-copy 实现文本复制
1 | // directive.js |
v-limitInput 实现输入框限制
1 | // 自定义事件 |