指令的钩子函数(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>