代码的复用和抽象主要还是通过组件对DOM元素进行底层操作,这个时候就会用到 自定义指令自定义局部指令: 组件中通过 directives 选项,只能在当前组件中使用; 自定义全局指令: app的 directive 方法,可以在任意组件中被使用;在组件内部定义的指令称为局部自定义指令。这样的指令只在组件的范围内有效,不会影响到其他组件。在组件的 directives 选项中注册指令:
<template>
<div v-local-example></div>
</template>
<script>
export default {
directives: {
localExample: {
bind(el, binding) {
// 指令绑定时的初始化操作
},
// 其他生命周期钩子函数
}
}
};
</script>
全局自定义指令在整个应用中可用。可以在 main.js 或其他入口文件中注册全局指令:
import { createApp ] from 'vue'
import App from'./自定义指令/App.vue'
const app = createApp(App)
//第一个参数即名称
app.directive("focus",{
//生命周期的函数( 自定义指今)
mounted(el) {
//console.Log("v-focus应用的元素被挂载了”,eL)
el?.focus()
app.mount('#app')
一个指令定义的对象,Vue提供了如下的几个钩子函数:
| 生命周期 | 调用时间 |
|---|---|
| created | 在绑定元素的 attribute 或事件监听器被应用之前调用 |
| beforeMount | 当指令第一次绑定到元素并且在挂载父组件之前调用 |
| mounted | 在绑定元素的父组件被挂载后调用 |
| beforeUpdate | 在更新包含组件的 VNode 之前调用 |
| updated | 在包含组件的 VNode 及其子组件的 VNode 更新后调用 |
| beforeUnmount | 在卸载绑定元素的父组件之前调用 |
| unmounted | 当指令与元素解除绑定且父组件已卸载时,只调用一次 |
下面是一些例子帮助理解掌握
案例代码:
import { createApp } from 'vue';
import App from './01_自定义指令/App.vue';
const app = createApp(App);
// 自定义指令:在元素上添加单位
app.directive("unit", {
// 指令绑定时调用
bind(el, binding) {
const defaultText = el.textContent;
let unit = binding.value;
// 如果没有传入单位,则默认为 "¥"
if (!unit) {
unit = "¥";
}
// 更新元素内容,拼接单位
el.textContent = unit + defaultText;
}
});
app.mount('#app');
案例代码:
import { createApp } from 'vue';
import App from './01_自定义指令/App.vue';
import dayjs from 'dayjs'; //
const app = createApp(App);
// 自定义指令:时间格式化
app.directive("ftime", {
// 指令绑定时调用
mounted(el, binding) {
// 1. 获取时间,并转换为毫秒
let timestamp = el.textContent;
if (timestamp.length === 1) {
timestamp = timestamp * 1000;
}
// 2. 获取传入的参数
let value = binding.value;
if (!value) {
value = "YYYY-MM-DD HH:mm:ss";
}
// 3. 对时间进行格式化
const formatTime = dayjs(timestamp).format(value);
el.textContent = formatTime;
}
});
app.mount('#app');
在这个例子中:
<h2 v-ftime="YYYY/MM/DD'">{{timestamp}}h2> // 2009/01/08
<h2 v-ftime>([ 1551111166666 ]]h2> // 1551-11-13 19:06:06
最后在这里附上公司当前项目采用的权限指令,供参考学习使用:
/**
* Permission 权限指令
* 指令用法:
* - 在需要控制 permission 级别权限的组件上使用 v-permission:[组件code] , 如下:
* 内容
* 内容
* - 当前用户没有权限时,组件上使用了该指令则会被隐藏
*/
export const permission = {
mounted: (el, binding) => {
const code = binding.arg || '';
const value = binding.value || '';
const baseStore = useBaseStore();
let userPermissions = [];
Object.keys(baseStore.userPermissions).forEach((item) => {
userPermissions = userPermissions.concat(baseStore.userPermissions[item]);
});
if (!userPermissions.includes(code)) {
if (value === 'disable') {
el.classList.add('is-disabled');
el.disabled = true;
} else {
// eslint-disable-next-line no-unused-expressions
(el.parentNode && el.parentNode.removeChild(el)) || (el.style.display = 'none');
}
}
},
unmounted: () => {},
};