vue自定义指令介绍

166 阅读2分钟

前言

Vue暴露了自定义指令的API给我们,让我们除了使用内置指令外,我们还可以自己定义指令,定义好后和内置指令的方式非常类似;都是被绑定到Vue实例的DOM元素上,它们可以用于修改元素的样式、响应用户事件、操作DOM等等。

在Vue中,自定义指令由一个指令定义对象构成,该对象包含一些钩子函数和一些可选的属性。同时在使用的时候需要我们先注册,注册分为全局注册和局部注册;

通过自定义指令,我们可以在DOM元素上添加额外的行为和交互效果,以满足特定的需求。

全局注册

全局注册:在main.js中注册全局自定义指令;(只能注册一个)

Vue.directive("指令名称", {
  //配置项
});

局部注册

局部可以注册多个,vue提供了一个directives对象用于局部注册;

export default {
  directives: {
    '指令名称': {
    //配置项
     },
  },
};

模版使用

模板中任何元素上使用新的自定义指令,如下:

<input v-"指令名称" />

自定义指令中的钩子函数

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

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

update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新

componentUpdated:指令所在组件的 VNode及其子 VNode全部更新后调用。

unbind:只调用一次,指令与元素解绑时调用。

钩子函数参数

el:指令所绑定的元素,可以用来直接操作 DOM。

binding:一个对象,包含以下属性:

  1. name:指令名,不包括 v- 前缀。
  2. value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
  3. oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
  4. expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
  5. arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
  6. modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。

应用场景

使用自定义指令可以满足我们日常一些场景,这里给出几个自定义指令的场景:

  • 表单防止重复提交
  • 图片懒加载
  • 一键 Copy的功能

自定义指令实现防抖函数

<template>
  <div>
    <div class="box">
      <h3 class="title">自定义指令</h3>
      <div>
          <span>自定义指令实现防抖函数:</span>
          <input type="text" v-model="inputVal"  v-debounce="inputVal">
      </div>
    </div>
  </div>
</template>

<script>
let Timer = null
export default {
  data () {
    return {
      inputVal: ''
    }
  },
  // 自定义指令
  directives: {
    debounce: {
      update (el, binding) {
        if (Timer) {
          clearTimeout(Timer)
        }
        Timer = setTimeout(() => {
          console.log(binding.value)
          // `发送请求。。。 请求参数 ${binding.value}`
        }, 500)
      }
    }
  }
}
</script>