欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > Vue 创建自定义指令 以及创建自定义指令相关属性说明

Vue 创建自定义指令 以及创建自定义指令相关属性说明

2024/10/24 1:54:40 来源:https://blog.csdn.net/m0_64750932/article/details/142094894  浏览:    关键词:Vue 创建自定义指令 以及创建自定义指令相关属性说明

Vue 创建自定义指令

Vue 除了使用内置的指令外,还可以创建自定义指令。

自定义指令的作用是扩展 Vue 的功能,可以自定义指令的行为,比如:

  • 自定义指令可以绑定到元素上,可以监听元素的事件,执行自定义的逻辑。
  • 自定义指令可以接收参数,可以动态修改指令的行为。
  • 自定义指令可以添加多个,可以组合使用。

自定义指令的语法

自定义指令的语法如下:

<div v-指令名称:参数="表达式"></div>
  • 指令名称:自定义指令的名称,可以自定义,但需要以 v- 开头。
  • 参数:可选参数,可以接收指令的附加参数。
  • 表达式:指令的表达式,可以动态修改指令的行为。

自定义指令的创建

自定义指令的创建需要使用 Vue.directive 方法,该方法接收两个参数:

  • 指令名称:自定义指令的名称。
  • 指令对象:一个对象,包含三个函数:

自定义指令的使用方法如下:

// 注册自定义指令
Vue.directive("指令名称", {bind: function (el, binding, vnode) {// 指令绑定时执行的函数},update: function (el, binding, vnode, oldVnode) {// 指令更新时执行的函数},unbind: function (el, binding, vnode) {// 指令解绑时执行的函数},
});
  1. bind:指令绑定时执行的函数,参数如下:
    • el:指令绑定的元素。
    • binding:一个对象,包含以下属性:
      • name:指令名称。
      • value:指令表达式的值。
      • oldValue:指令表达式的旧值。
      • expression:指令表达式。
      • arg:指令参数。
      • modifiers:一个对象,包含修饰符。
    • vnode:指令所在的虚拟节点。
  2. update:指令更新时执行的函数,参数如下:
    • el:指令绑定的元素。
    • binding:一个对象,包含以下属性:
      • name:指令名称。
      • value:指令表达式的值。
      • oldValue:指令表达式的旧值。
      • expression:指令表达式。
      • arg:指令参数。
      • modifiers:一个对象,包含修饰符。
    • vnode:指令所在的虚拟节点。
    • oldVnode:指令所在的旧虚拟节点。
  3. unbind:指令解绑时执行的函数,参数如下:
    • el:指令绑定的元素。
    • binding:一个对象,包含以下属性:
      • name:指令名称。
      • value:指令表达式的值。
      • oldValue:指令表达式的旧值。
      • expression:指令表达式。
      • arg:指令参数。
      • modifiers:一个对象,包含修饰符。
    • vnode:指令所在的虚拟节点。

自定义指令的示例 - 控制页面按钮的显示隐藏 v-hasPermi

  1. 注册自定义指令:
Vue.directive("hasPermi", {bind: function (el, binding, vnode) {// 获取权限列表var permissons = vnode.context.$route.meta.permissons;// 获取按钮的名称var btnName = binding.arg;// 获取按钮的显示隐藏状态var show = false;// 遍历权限列表,判断按钮是否显示for (var i = 0; i < permissons.length; i++) {if (permissons[i] === btnName) {show = true;break;}}// 根据显示隐藏状态,显示或隐藏按钮if (show) {el.style.display = "block";} else {el.style.display = "none";}},
});
  1. 在页面中使用自定义指令:
<button v-hasPermi="'btn1'">按钮1</button>
<button v-hasPermi="'btn2'">按钮2</button>
<button v-hasPermi="'btn3'">按钮3</button>

其中,btn1btn2btn3 是权限列表,页面中只有 btn1 按钮的权限,所以 btn1 按钮显示,其他按钮隐藏。

  1. 页面路由配置:
const routes = [{path: "/home",name: "home",component: Home,meta: {permissons: ["btn1"],},},{path: "/about",name: "about",component: About,meta: {permissons: ["btn2", "btn3"],},},
];
  1. 页面路由切换时,根据路由的 meta.permissons 列表,动态显示或隐藏按钮。

Vue3 组合式 api 使用自定义指令

Vue3 组合式 api 允许我们在 setup 函数中使用组合式 api,包括 directivesprovideinjectwatchEffect 等。

setup 函数中使用自定义指令,需要先注册自定义指令,然后在 directives 选项中添加自定义指令的名称。

import { ref, onMounted } from "vue";export default {name: "App",setup() {const count = ref(0);const increment = () => {count.value++;};onMounted(() => {console.log("mounted");});return {count,increment,};},directives: {hasPermi: {mounted(el, binding) {// 获取权限列表const permissons = binding.instance.proxy.$route.meta.permissons;// 获取按钮的名称const btnName = binding.arg;// 获取按钮的显示隐藏状态let show = false;// 遍历权限列表,判断按钮是否显示for (let i = 0; i < permissons.length; i++) {if (permissons[i] === btnName) {show = true;break;}}// 根据显示隐藏状态,显示或隐藏按钮if (show) {el.style.display = "block";} else {el.style.display = "none";}},},},
};
  1. 注册自定义指令:
directives: {hasPermi: {mounted(el, binding) {// 获取权限列表const permissons = binding.instance.proxy.$route.meta.permissons;// 获取按钮的名称const btnName = binding.arg;// 获取按钮的显示隐藏状态let show = false;// 遍历权限列表,判断按钮是否显示for (let i = 0; i < permissons.length; i++) {if (permissons[i] === btnName) {show = true;break;}}// 根据显示隐藏状态,显示或隐藏按钮if (show) {el.style.display = "block";} else {el.style.display = "none";}},},
},
  1. 在页面中使用自定义指令:
<button v-hasPermi="'btn1'">按钮1</button>
<button v-hasPermi="'btn2'">按钮2</button>
<button v-hasPermi="'btn3'">按钮3</button>

其中,btn1btn2btn3 是权限列表,页面中只有 btn1 按钮的权限,所以 btn1 按钮显示,其他按钮隐藏。

  1. 页面路由配置:
const routes = [{path: "/home",name: "home",component: Home,meta: {permissons: ["btn1"],},},{path: "/about",name: "about",component: About,meta: {permissons: ["btn2", "btn3"],},},
];
  1. 页面路由切换时,根据路由的 meta.permissons 列表,动态显示或隐藏按钮。

自定义指令的注意事项

  • 自定义指令的名称,需要以 v- 开头。
  • 自定义指令的表达式,可以动态修改指令的行为。
  • 自定义指令的 bindupdateunbind 函数,可以接收三个参数。
  • 自定义指令的 bindupdateunbind 函数,可以返回 false,阻止默认行为。
  • 自定义指令的 update 函数,可以接收 oldVnode 参数,可以获取指令所在的旧虚拟节点。
  • 自定义指令的 unbind 函数,可以接收 vnode 参数,可以获取指令所在的虚拟节点。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com