Vue2-Vue.directive自定义指令

195 阅读2分钟

Vue.directive 是 Vue.js 提供的全局指令注册方法,用于自定义指令。我们可以通过它来扩展 Vue.js 的模板语法,使得我们能够创建自己的指令,以实现一些特殊的效果。

注意directives 是用于注册自定义指令的 Vue 实例选项,而 Vue.directive 是全局方法,用于注册全局自定义指令或在组件中注册局部自定义指令。

基础语法

  1. 定义:Vue.directive(name, options)
Vue.directive('my-directive', {
  bind: function (el, binding, vnode) {
    // 在元素绑定到指令时调用
  },
  inserted: function (el, binding, vnode) {
    // 元素插入父节点时调用
  },
  update: function (el, binding, vnode, oldVnode) {
    // 在元素所在组件更新时调用,也可以在初始绑定值发生变化时调用
    // 可以通过比较新旧值来执行相应的操作
  },
  componentUpdated: function (el, binding, vnode, oldVnode) {
    // 在元素所在组件及其子组件全部更新后调用
  },
  unbind: function (el, binding, vnode) {
    // 在指令与元素解绑时调用
  }
});

// 当只需要 update 函数时,可以传入一个函数替代定义对象
Vue.directive('my-directive', function (el, binding, vnode, oldVnode) {
  // 这个函数用作 update()
});
  1. 使用:需带前缀 v-
<!-- 不带值与参数 -->
<div v-my-directive="someValue"></div>
<!-- 仅带值 binding.value -->
<div v-my-directive="someValue"></div>
<!-- 仅带参数 binding.arg -->
<div v-my-directive:[arg1, args2]></div>
<!-- 带值与参数 binding.arg + binding.value -->
<div v-my-directive:[arg1, args2]="someValue"></div>

钩子函数

钩子函数描述参数
bind只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。el, binding
inserted被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。el, binding
update所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。el, binding, vnode, oldVnode
componentUpdated指令所在组件的VNode及其子VNode全部更新后调用。el, binding, vnode, oldVnode
unbind只调用一次,指令与元素解绑时调用。el, binding
  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下 property:
    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2
    • oldValue:指令绑定的前一个值,仅在 updatecomponentUpdated 钩子中可用。
    • 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:上一个虚拟节点,仅在 updatecomponentUpdated 钩子中可用。