当前位置: 首页 > article >正文

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 参数,可以获取指令所在的虚拟节点。

http://www.kler.cn/news/305459.html

相关文章:

  • DFS 算法:洛谷B3625迷宫寻路
  • Redis相关命令详解
  • Understanding the model of openAI 5 (1024 unit LSTM reinforcement learning)
  • WSL安装Redis
  • 【linux】 cd命令
  • 代码随想录算法训练营第62天| 图论 Floyd算法 A*算法
  • 鸿蒙 NEXT 生态应用核心技术理念:可分可合,自由流转
  • 开源 AI 智能名片 S2B2C 商城小程序相关角色的探索
  • 基于vue框架的宠物爱好者交流网站的设计与实现p2653(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 黑马点评19——多级缓存-缓存同步
  • 基于SSM的银发在线教育云平台的设计与实现
  • Qt事件处理机制
  • wandb一直上传 解决方案
  • 大顶堆+动态规划+二分
  • 微信小程序播放音频方法,解决uniapp 微信小程序不能播放本地音频的方法
  • 地震勘探原理视频总结(1-6)
  • K8s 简介以及详细部署步骤
  • python中实用的数组操作技巧i奥,都在这里了
  • 聊点基础的,关于监控,关于告警(prometheus—+grafana+夜莺如何丝滑使用?)
  • Redis的数据类型以及应用场景
  • 4个方法教你图片转PDF怎么弄。
  • redis短信登录模型
  • for循环语句
  • 支持向量机(Support Vector Machines,SVM)—有监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习、核方法
  • 【STM32 MCU】stm32MCUs 32-bit Arm Cortex-M
  • 关于 openeuler 22.03-LTS-SP4 scp 失败问题的记录
  • c++基础入门二
  • 【RabbitMQ 项目】服务端:数据管理模块之消息队列管理
  • 速盾:高防服务器租用需要注意什么事项
  • FPGA开发:模块 × 实例化