Vue自定义指令

221 阅读2分钟

Vue的灵活需要你的自定义

Vue-directive允许注册自定义指令。注册的时候允许你全局/局部注册指令。区别:

1. 注册全局指令需要使用vue.directive()。

2. 注册局部指令需要在data同级插入directive:{}属性。

// 注册一个全局自定义指令
Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
// 局部指令
directives: {
  focus: {
    inserted: function (el) {
      el.focus()
    }
  }
}

// 使用它
<input v-focus>

其中的focus为自定义指令的名字,使用的时候可以直接放到html便签中使用。

上面也可以看到与一个inserted函数,它便是五大钩子函数之一。钩子函数会在特定的时候被执行。

  • 五大钩子函数

    • bind:绑定到html元素的时候触发,只会触发一次。

    • inserted:被绑定的元素插入时触发(仅保证父节点存在,但不一定已被插入文档中)。

    • update:所在的component的Vnode发生改变的时候触发。(更为复杂一些)

    • componentUpdate:所在组件的Vnode全部更新的时候触发。

    • unbind:解除绑定的时候触发,只会触发一次。

  • 这些钩子函数都将拿到什么参数呢?

    • el:绑定dom的实例。
    • binding:一个对象包含以下属性
      • name:指令名,例如:focus
      • value:指令=后面的值,例如:v-focus = “1+1”,值为“2”
      • oldvalue:指令绑的前一个值(更新的时候才会有)
      • expression:指令=后面的字符串表达,例如:v-focus = “1+1”,表达式为“1+1”
      • arg:传给指令的参数,例如:v-focus:foo 中,参数为 "foo"。
      • Modifiers:修饰符。例如:v-focus.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
    • vnode
    • oldVnode。
  • 简写模式

很多时候你不需要那么多的自定义行为,所以你可以使用简写模式

想在 bind 和 update 时触发相同行为,而不关心其它的钩子。就可以直接传一个匿名函数即可。

Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})
  • 对象字面量

如果指令需要多个值,可以传入一个 JavaScript 对象字面量。记住,指令函数能够接受所有合法的 JavaScript 表达式。

<div v-demo="{ color: 'white', text: 'hello!' }"></div>

Vue.directive('demo', function (el, binding) {
  console.log(binding.value.color) // => "white"
  console.log(binding.value.text)  // => "hello!"
})