Vue自定义指令directive

2020-02-16  本文已影响0人  learninginto

Vue自定义指令directive

指令的作用:操作DOM 。(参考官方文档

一、分类

Vue.directive("test",(el,...rest)=>{
    console.log(rest)
})
directive.png

参数1:指令名称

参数2:指令的配置项(函数、对象)

eg:(函数)

​ 参数1:使用当前指令的元素

​ 参数2:指令的详情信息

​ { modifers:修饰符,value:指令的结果(它所对应的值) }

<div id="app">
    <div v-test="'lxc'.substr(1,2)" 
         v-background="'green'">
    </div>
    <div v-event.stop="'green'"></div>
</div>

需要将Utils.js在入口文件main.js中引入

Vue.directive("test", (el, { value }) => {
    el.innerText = value;
})

Vue.directive("background", (el, { value }) => {
    el.style.backgroundColor = value;
})

Vue.directive("event", (el, { value, modifiers }) => {
    let { stop } = modifiers;

    el.addEventListener("click", (e) => {
        if (stop) {
            e.stopPropagation();
        }
        value();
    })
})
directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}

可以在模板中任何元素上使用新的 v-focus 属性,如下:

<input v-focus>

允许设置两种修饰符modifiers:l——横向拖拽;t——纵向拖拽;l.t(默认)任意拖拽

<template>
  <div id="app">
    <div v-drag.t="flag" id="box"></div>
  </div>
</template>

<script>
export default {
  name: "App",
  directives: {
    drag(el, { modifiers, value }) {
      if (value) {
        var disX, disY;
        var { l, t } = modifiers;
        el.style.position = "absolute";
        el.addEventListener("mousedown", mousedown);

        function mousedown(e) {
          disX = e.offsetX;
          disY = e.offsetY;

          document.addEventListener("mousemove", move);
          document.addEventListener("mouseup", up);
        }
        function move(e) {
          var x = e.clientX - disX;
          var y = e.clientY - disY;

          if ((l && t) || (!l && !t) ) {
            el.style.left = x + "px";
            el.style.top = y + "px";
            return;
          }
          if(l){
            el.style.left = x + 'px'
            return;
          }
          if(t){
            el.style.top = x + 'px'
            return;
          }
        }
        function up() {
          document.removeEventListener("mousemove", move);
          document.removeEventListener("mouseup", up);
        }
      }
    }
  },
  data() {
    return {
      flag: true,
      msg: "lxc"
    };
  },
  methods: {
    handleToggle() {
      this.flag = !this.flag;
    }
  }
};
</script>

<style>
#box {
  width: 100px;
  height: 100px;
  background: #c33;
}
</style>

二、钩子函数

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

上一篇 下一篇

猜你喜欢

热点阅读