VUE2自定义指令

vue2和vue3的自定义指令链接

指令的钩子函数(v3有较大的改变)

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

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

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

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

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

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

钩子函数参数

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

binding:
一个对象

vnode:
Vue 编译生成的虚拟节点

oldVnode:
上一个虚拟节点

vue2自定义全局指令

1.新建directives.js文件

const color = {
    inserted: function (el, binding, vnode) {
        el.style.color = binding.value
    },
}

// 直接鉴权
let permission = {
    inserted(el, binding) {
        let value = binding.value || 'normal'; // 获取到 v-permission的值
        if (value) {
            let hasPermission = checkArray(value);
            if (!hasPermission) { // 没有权限 移除Dom元素
                el.parentNode && el.parentNode.removeChild(el);
            }
        }
    }
}

function checkArray(key = "normal") {
    let arr = ["normal", "teacher", "admin"]  // 标识 这是一个
    if (arr.includes(key) && key !== "normal") {
        return true // 有权限
    } else {
        return false // 无权限
    }
}

// 和store集合的鉴权
let permissionstore = {
    inserted(el, binding, vnode) {
        console.log(el)
        console.log(binding)
        console.log(vnode)
        if (vnode.context.$store.getters.isHas) { // 没有权限 移除Dom元素
            el.parentNode && el.parentNode.removeChild(el);
        }
    }
}

export {
    permissionstore,
    permission,
    color
}

2.使用
main.js

import { color,permission,permissionstore } from "../assets/js/directives.js"
// 注册全局指令
Vue.directive("permissionstore", permissionstore)
Vue.directive("permission", permission)
Vue.directive("color", color)

VUE2自定义私有指令

案例

指令的使用

<template>
  <div>
    <ul
      v-activeNav="{
        activeIndex,
        activeClass: 'active',
        cClass: 'li',
      }"
    >
      <li
        class="morenclass"
        v-for="(item, index) in list"
        :key="index"
        @click="changeIndex(index)"
      >
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "navlist",
  directives: {
    activeNav: {
      bind(el, bings) {
        // console.log();
        let eles = el.querySelectorAll(bings.value.cClass);

        eles[bings.value.activeIndex].classList.add(bings.value.activeClass);
      },
      update(el, binding) {
        let eles = el.querySelectorAll(binding.value.cClass);
        eles[binding.value.activeIndex].classList.add(
          binding.value.activeClass
        );
         eles[binding.oldValue.activeIndex].classList.remove(
          binding.value.activeClass
        );
      },
    },
  },
  data() {
    return {
      activeIndex: 0,
      list: [
        {
          name: "标题栏1",
        },
        {
          name: "标题栏2",
        },
        {
          name: "标题栏3",
        },
        {
          name: "标题栏4",
        },
      ],
    };
  },
  methods: {
    changeIndex(index) {
      this.activeIndex = index;
    },
  },
};
</script>
<style lang="scss" scoped>
ul {
  list-style: none;
  display: flex;
  li {
    margin-right: 20px;
  }
  .morenclass {
    color: #666;
  }
}
.active {
  color: red !important;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值