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

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令

        📓全局自定义指令和组件自定义指令的区别,除了写法不同和作用不同,其他的包括生命周期的使用方法都是一致的,全局自定义指令在main.ts中注册后整个项目都可以使用,而组件自定义指令只能在组件中注册,并且在组件中使用。

1,全局自定义指令

        📓首先我们可以了解下为什么要创建全局自定义指令,首先,vue官方给我们提供了一些指令,那些指令虽然很强大,但是有可能会不适合当前公司的一个开发的实际的业务逻辑,所以这时候我们就得需要通过官方提供的方法创建输入自己的指令了。

        📓下面根据我的思路来一步步的设计全局自定义组件吧

1.1 创建组件的执行函数

         📓在项目中新建文件夹directive,在文件夹里新建idnex.ts文件,在文件里写处理逻辑

        

1.2 在里面写写我们的指令的生命周期和处理代码

export default {click: {beforeMount(el:any, binding:any, vnode:any) { //元素被挂载到dom之前调用console.log('beforeMount');},mounted(el:any, binding:any, vnode:any) {//元素被挂载到dom之后调用console.log('mounted');},beforeUpdate(el:any, binding:any, vnode:any, prevvnode:any) {//vnode(虚拟节点)更新前调用console.log('beforeUpdate');},updated(el:any, binding:any, vnode:any, prevvnode:any) {//vnode(虚拟节点)更新后调用console.log('updated');},beforeUnmount(el:any, binding:any, vnode:any) {//vnode(虚拟节点)卸载前调用console.log('beforeUnmount');},unmounted(el:any, binding:any, vnode:any) {//vnode(虚拟节点)卸载后调用console.log('unmounted');},},
};

       📓如上方所示,vue的创建指令的方法,处理接受指令名称的话,还需要接受我们指令的生命周期,vue创建指令的方法接受2个参数,第一个参数是指令名称,第二个参数是对象,对象里面的属性是指令的生命周期,属性值就是在当前生命周期所要执行的函数。       

 这里在解释下,为什么要元素要挂在到dom上还有解释什么是vnode

        📓 首先你页面中的元素,最终都会变成真正的dom元素,并讲这个元素放在页面上,这个过程解释挂载,在挂载这个元素之前,vue首先会创建组件的vnode,也就是虚拟节点,然后在将组件的虚拟节点(vnode)转换成真实的dom元素,并将其插入到页面的特定位置上去,所以这就是vnode,元素在页面上显示之前需要在vnode上创建虚拟节点

       📓至于为什么要将元素挂载到dom,我们知道,vue的整个体系,都是需要dom来支撑的,因为只有将元素插入到dom中,这个元素才会在页面上显示,而且只有将这个元素插入挂载到dom中,vue才能管理他的生命周期,响应式,事件处理等。

 指令的生命周期和组件的生命周期很相似。很多地方都基本一致

  1.3 在main.ts中注册指令

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import store from "./store";
import dir from "./directive/index"; //从这里导入我们创建的指令的生命周期const app = createApp(App); //创建app实例app.directive("myDirective", dir.click); //注册指令需要调用app的directive方法,这个方法传入2个参数第一个参数就是我们的组件名称,第二个参数就是我们在directive文件夹里写的对象,对象里有指令的生命周期方法app.use(router).use(ElementPlus).use(store).mount("#app");

 这里要注意下,注册指令一定要比挂载app之前,要比mount("#app")更早执行!!!,不然会注册失败

1.4 在页面上使用

         📓当我们注册完成后,就能在元素上使用了,如下

    <div><button v-myDirective>{{ butt }}</button><button @click="buttfn">修改 </button><RouterView /></div>

         📓这里我给button加上了一个指令,这里要注意下,我们在页面上使用指令时,得在我们注册时写的指令名称前加上 v- 

1.5 获取元素的dom,并修改

        📓现在在页面上元素使用,还不算达到我们的预期,这时候我们需要看如何操作元素,这才算达到我们的预期,首先,我们在directive文件夹里,找到我们定义的指令生命周期,生命周期的属性值接受一些参数,我们打印下这些参数是啥

看下页面上显示的结果

 📓我们能看到,el居然是我们在页面上绑定元素的元素对象,我们可以通过这个元素对象来修改这个元素的属性,或者是进行一些事件操作了。

 📓比如,我要修改元素的颜色

 📓这时候还是有些不够的,假设,我们想实现一个@click的功能,如果用指令实现咧,这时候我们就需要靠函数中另外一个参数binding,通过这个参数来接收从页面上传入的一些值,包括函数,

 📓我们在页面上定义一个函数,通过  指令="函数" 的方法,将指令传给函数

<template><div><button v-myDirective = "butt">{{ butt }}</button> //将函数传给指令<RouterView /></div>
</template>
<script lang="ts">
import router from '@/router'
import { ref } from "vue"
export default ({setup() {const butt = ref("跳转")const fn = () => {  //定义一个函数router.push("/user")}return {fn,butt}}
})</script>

 📓在我们的指令生命周期函数里,就能接受这个函数,并写入跳转的指令

export default {click: {mounted(el: any, binding: any) {//元素被挂载到dom之后调用el.addEventListener("click",binding.instance.fn)  //通过binding.instance来获取我们之前传入的参数,在通过这个元素对象写入一个点击事件,就实现了类似于@click一样的功能了},},
};

 📓这样,我们的自定义指令也有和@click一样的功能啦,这只是简单的用法,当配合指令的生命周期函数后,能够实现的东西非常非常的多。

2,组件自定义指令

       📓  组件自定义指令的生命周期和用法和全局自定义指令的用法一致,只是写法不同而已,看下方的例子

        

<template><div><button v-myDirective = "butt">{{ butt }}</button><div v-color = "'red'">我是组件内指令</div>   //2.将定义好的组指令放在页面上使用<RouterView /></div>
</template>
<script lang="ts">
import router from '@/router'
import { ref } from "vue"
export default ({setup() {const butt = ref("跳转")const fn = () => {router.push("/user")}return {fn,butt}},directives:{  //1.在组件里添加directives属性,属性值是对象,对象的属性就是我们的指令名称,属性值也是一个对象,在对象里写生命周期函数即可color:{mounted(el:any,bind:any){el.style.color=bind.value}}}
})</script>

最近烦心的事不少,感觉诸事不顺,从来没觉得这样过。因为一件事情的出现,导致我的梦想,我的一切规划,都没了 ,很难过,愁啊。不知道如何取舍,感觉都在将他们的想法强加给我,用所谓的大义来压我。很累很累

相关文章:

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…...

JVM 堆外内存详解

Java 进程内存占用除了JVM 运行时数据区&#xff0c;还有直接内存&#xff08;Direct Memory&#xff09;区域及 JVM 程序自身也会占用内存 直接内存&#xff08;Direct Memory&#xff09;区域&#xff1a;直接内存通过使用Native堆外内存来存储数据&#xff0c;这意味着数据…...

数据库的基本概念以及MySQL基本操作

一、数据库的基本概念 1、数据库的组成 数据&#xff1a;描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录等 以“记录”形式按统一格式进行存储 表&#xff1a;将不同的记录组织在一起&#xff0c;用来存储具体数据 数据库&#xff1a; 表的集合…...

【Docker】Docker安装Nginx配置静态资源

1.下载镜像 2.创建nginx配置文件 3.创建nginx容器运行 4.配置nginx静态资源 1.下载镜像 Dockerhub官网&#xff1a;Docker docker pull nginx docker pull nginx下载最新版本 默认latest 下载指定版本docker pull nginx:xxx 2.创建nginx配置文件 启动容器之前要创建nginx…...

【码神之路】【Golang】博客网站的搭建【学习笔记整理 持续更新...】

介绍 一个用原生GO开发的博客网站&#xff0c;涉及Golang Web开发、Web服务器搭建和HTTP请求处理、模板与静态资源处理等 技术栈 后端&#xff1a;Go、Go并发机制前端&#xff1a;HTML模版链接直达 Golang搭建博客网站的学习视频 注&#xff1a;这里我只记录我实质✅学习到…...

Win10 电源选项那选择“关闭显示器“为1分钟,1分钟后就锁屏了?怎么才能关闭显示器后不锁屏

环境&#xff1a; Win10专业版 问题描述&#xff1a; Win10 电源选项那选择"关闭显示器"为1分钟&#xff0c;1分钟后就锁屏了&#xff1f;怎么才能关闭显示器后不锁屏 解决方案&#xff1a; 方法一 更改注册表可以实现关闭显示器而不锁屏的效果。请按照以下步骤…...

虚拟机centos设置网络模式(桥接|NAT)

前言 桥接模式是通过物理网卡直接与外部网络建立联系的&#xff0c;而NAT模式则是通过虚拟网卡VMnet1或VMnet8通过宿主机共享IP与外部建立网络关系当需要将虚拟机资源共享给局域网用户使用时&#xff0c;宜采用桥接模式&#xff1b;当需要保护虚拟机资源&#xff0c;确保只能由…...

MySQL 8.2 Command Line Client打开时一闪而过闪退问题

MySQL8.2安装成功后&#xff0c;发现打开MySQL 8.0 Command Line Client时出现一闪而过&#xff0c;打不开的情况。 解决方案&#xff1a; 1、打开MySQL 8.2 Command Line Client文件位置 2、右键选择属性 3、复制它的目标 4、我复制下来的目标路径是这样的&#xff0c;"…...

【NI-RIO入门】CompactRIO介绍及环境安装

CompactRIO是什么&#xff1f; CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具&#xff0c;使其成为工业物联网、监测和控制应用的理想之选。实时处理器提供可靠&#xff0c;可预测的行为&#xff0c;而FPGA在需要高速逻辑和精确定时的较小任务上表现出色…...

生产问题 Recv-Q101

生产上服务端口 Recv-Q101 新请求到服务器的失败&#xff0c;幸好及时发现&#xff0c;通过重启服务之后得到解决&#xff0c;具体原因等待排查 目前觉得的原因是&#xff1a;某些请求暂用时间比较久...

从零开始:Rust环境搭建指南

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起探讨如何从零开始搭建Rust开发环境。 Rust环境搭建概览 Rust是一种系统编程语言&#xff0c;以其安全性、并发性和性能闻名。搭建Rust环境是学习和使用这一语言的第一步。 第一步&#xff1a;安装Rust Rust的…...

Tensorrt 实现 yolov5-cls 遇到的问题

yolov5-6.2增加了分类训练、验证、预测和导出&#xff08;所有 11 种格式&#xff09;&#xff0c;还提供了 ImageNet 预训练的 YOLOv5m-cls、ResNet&#xff08;18、34、50、101) 和 EfficientNet (b0-b3) 模型. 官方Git : https://github.com/ultralytics/yolov5 分类模型与…...

智能指针(Newbie Note)

智能指针专题 1.普通指针的问题2.智能指针是什么什么是所有权 3.智能指针三个好处&#xff1a;4.C11提供的智能指针4.1 shared_ptr&#xff08;共享所有权指针&#xff09;4.1.1 分配内存4.1.2 成员函数4.1.3 计数情况汇总&#xff1a;4.1.4 示例代码(计数)4.1.5 示例代码(rese…...

2023.11.22 homework

七年级数学 五年级数学 也不知道可以教到几年级&#xff0c;估计很快就教不动了。人生啊。...

存储日志数据并满足安全要求

日志数据是包含有关网络中发生的事件的记录的重要信息&#xff0c;日志数据对于监控网络和了解网络活动、用户操作及其动机至关重要。 由于网络中的每个设备都会生成日志&#xff0c;因此收集的数据量巨大&#xff0c;管理和存储所有这些数据成为一项挑战&#xff0c;日志归档…...

Linux系统管理与服务器安全:构建稳健云数据中心

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;云数据中心已经成…...

用css实现原生form中radio单选框和input输入框的hover样式以及聚焦focus的样式

一.问题描述&#xff1a;用css实现原生form中radio单选框和input的hover已经focus的样式 在实际的开发中&#xff0c;一般公司ui都会给效果图&#xff0c;比如单选按钮radio样式&#xff0c;input输入框hover的时候样式&#xff0c;以及focus的时候样式&#xff0c;等等&#…...

【中国平安社招校招】【内推】【当天内推】

中国平安社招校招内推 通过内推链接即时内推&#xff0c;反馈速度比正常要快(可私信问进度) 开放大量HC(不限岗位和地区,技术、设计、产品、运营、数据等都可内推) Step1&#xff1a;查看相关职位 浏览平安的招聘官网&#xff1a;复制以下地址至浏览器打开。注意以下链接包含…...

CentOS 8最小安装,VM使用这个内存占用小很多

文章目录 一、安装包下载作者使用的安装包 二、安装过程截图三、最小化安装拥有的外部命令四、查看ip&#xff08;方便ssh连接&#xff09;五、yum源有问题参考文档 一、安装包下载 CentOS 网站&#xff1a; https://www.centos.org/CentOS 维基&#xff1a; https://wiki.cen…...

【C++ Primer Plus学习记录】递增运算符(++)和递减运算符(--)

递增运算符&#xff08;&#xff09;和递减运算符&#xff08;--&#xff09;&#xff1a;前缀版本位于操作数前面&#xff0c;如x&#xff1b;后缀版本位于操作数后面&#xff0c;如x。两个版本对操作数的影响是一样的&#xff0c;但是影响的时间不同。这就像吃饭前买单和吃饭…...

避坑指南:为什么我总劝新手安装Anaconda时别勾选‘添加到PATH’?

为什么Anaconda安装时不该勾选"添加到PATH"&#xff1f;深度解析环境变量陷阱 第一次安装Anaconda时&#xff0c;那个看似无害的"Add Anaconda to my PATH environment variable"选项就像潘多拉魔盒——勾选它可能打开一连串意想不到的问题。作为处理过数百…...

如何快速入门一门编程语言

快速入门一门编程语言 学习编程语言时&#xff0c;掌握基础语法是关键。建议通过实战项目来提升技能&#xff0c;例如开发一个小型应用。 1. 选择合适的语言 根据目标选择语言&#xff0c;如Python适合数据分析&#xff0c;Java适合企业级开发。 2. 学习基础语法 掌握变量、函数…...

给数学老师的Python礼物:用Manim从零制作你的第一个教学动画(附完整代码)

给数学老师的Python礼物&#xff1a;用Manim从零制作你的第一个教学动画&#xff08;附完整代码&#xff09; 数学课堂上&#xff0c;一个生动的动画往往能让学生瞬间理解抽象概念。想象一下&#xff0c;当你在黑板上费力绘制正弦函数时&#xff0c;如果能直接展示正弦波如何随…...

DeepONet在计算流体力学中的高效流场预测应用

1. 项目背景与核心挑战在计算流体力学领域&#xff0c;复杂几何条件下的非定常流场预测一直是工程实践中的难点问题。传统CFD方法虽然精度较高&#xff0c;但计算成本巨大&#xff0c;单次仿真往往需要数小时甚至数天时间。我在参与某型航空发动机叶片设计项目时&#xff0c;就…...

基于MediaPipe与OpenCV的手势控制系统:从原理到工程实践

1. 项目概述&#xff1a;从“隔空操作”到“手势控制系统”的工程化思考最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Gesture-Control-System”&#xff0c;作者是ArchitJ6。光看名字&#xff0c;你可能会觉得这又是一个用摄像头识别手势来控制电脑的“玩具”项目。但…...

仿照Muduo的高并发服务器:EventLoop模块及与TimeWheel模块联调

本期接着深入编写项目代码 相关代码上传至gitee&#xff1a;喜欢可以点个赞谢谢 目录 EventLoop模块 Eventfd机制 设计思路 源码 TimeWheel时间轮模块整合 设计思想 源码 EventLoop模块与TimeWheel模块联调整合 EventLoop模块 Eventfd机制 eventfd是本项目中的一种事件通知…...

Navicat学生实用指南

下载与安装Navicat官网提供Windows、macOS和Linux版本下载。访问官网后选择对应操作系统版本&#xff0c;点击下载按钮获取安装包。Windows用户双击安装包&#xff0c;按照向导提示完成安装。macOS用户将Navicat图标拖拽至Applications文件夹即可完成安装。连接数据库启动Navic…...

Flutter 跨平台实战:OpenHarmony 健康管理应用 Day3|页面路由跳转与多表单联动实现

&#x1f3af; Flutter 跨平台实战&#xff1a;OpenHarmony 健康管理应用 Day3&#xff5c;页面路由跳转与多表单联动实现 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net &#x1f680; 前言 大家好&#xff01;本篇是我真实完成 Flutte…...

Cimoc漫画1.7.266逆向广告弹窗

今天安鹿聚焦Cimoc漫画1.7.266的深度优化&#xff0c;手把手教大家实现内置图源、去除广告、屏蔽弹窗与强制更新的操作&#xff0c;无需复杂步骤&#xff0c;打造一个纯净无干扰的看漫工具。 工具 MT管理器(看版本号选最新版本) NP管理器(看版本号选最新版本) Cimoc漫画&…...

TOML vs YAML:为什么 Cargo 选择 TOML?

TOML vs YAML&#xff1a;为什么 Cargo 选择 TOML&#xff1f; YAML 的问题 YAML 看起来简洁&#xff0c;但它有几个出了名的"坑"&#xff1a; 1. 语法过于复杂 YAML 规范极其庞大&#xff08;1.2 规范有 80 页&#xff09;&#xff0c;边界情况很多&#xff0c;不同…...