vue自定义指令

自定义指令是什么?

内置指令例如:v-model、v-show、v-bind、v-on等等 开发者自己也可以定义指令 vue自定义指令包含两种创建方式: 全局注册和组件注册。

全局注册

1. 在src下新建 directives/index.js文件

import wht from "./wht";
import debounce from "./debounce";
import copy from "./copy";
const directives = {
  debounce,
  wht,
  copy,
};

export default {
  install(Vue) {
    Object.keys(directives).forEach((item) => {
      Vue.directive(item, directives[item]);
    });
  },
};

2. main.js中引用

import Vue from "vue";
import App from "./App";
import router from "./router";
//此处是directives引用 begin
import Directives from "./directives";

Vue.use(Directives);
//此处是directives引用 end

Vue.config.productionTip = false;
/* eslint-disable no-new */
new Vue({
  el: "#app",
  router,
  components: { App },
  template: "<App/>",
});

3. 创建指令

  const copy = {
  /**
   *初始化绑定,只调用一次,指令第一次绑定到元素时调用,可以定义一个在绑定时执行一次的初始化动作
   * @param {*} el 当前的元素
   * @param {*} 例如:v-copy="测试文字" { value }是binding.value的缩写,可以直接获取value,也就是“测试文字”
   */
  bind: function(el, { value }) {
    el.newvalue = value;
    el.handler = function() {
      console.log(value);
      if (!el.newvalue) {
        console.log("复制的值为空");
        return;
      }
      let textarea = document.createElement("textarea");
      textarea.style.position = "absolute";
      textarea.style.left = "-1000px";
      textarea.style.readOnly = "readonly";
      textarea.value = el.newvalue;
      document.body.appendChild(textarea);
      textarea.select();

      let result = document.execCommand("copy");
      if (result) {
        console.log("复制成功");
      }
      document.body.removeChild(textarea);
    };
    el.addEventListener("click", el.handler);
  },
  //被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  inserted: function() {
    //插入节点
  },
  /**
   * 被绑定元素所在模板完成一次更新周期时调用。
   * @param {*} el 当前元素
   * @param {*} 获取当前绑定的值
   */
  componentUpdated: function(el, { value }) {
    el.newvalue = value;
  },
  //只调用一次, 指令与元素解绑时调用。
  unbind: function(el, { value }) {
    el.removeEventListener("click", el.handler);
  },
};

export default copy;


4.使用方法

<template>
   <div class="">
      <input type="text" v-model="copyText" placeholder="请输入要复制的文字" />
      <button v-copy="copyText">点击复制自定义文字</button>
    </div>
</template>

<script>
  export default {
    data() {
      return {
        copyText: '要复制的指令内容',
      }
    },
  }
</script>