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

news2024/9/28 19:15:58

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

        📓全局自定义指令和组件自定义指令的区别,除了写法不同和作用不同,其他的包括生命周期的使用方法都是一致的,全局自定义指令在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>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1235688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dvwa-command injection 代码审计(超详细逐行审计)

dvwa-command injection 代码审计 low <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Determine OS and execute the ping command.if( stristr( php_uname( s ), Windows NT ) ) {// Windows$cmd shell_exec( ping . $target );}…

Parallel Diffusion Models of Operator and Image for Blind Inverse Problems

盲逆问题算子和图像的并行扩散模型 论文链接&#xff1a;https://arxiv.org/abs/2211.10656 项目链接&#xff1a;https://github.com/BlindDPS/blind-dps Abstract 在正向算子已知的情况下(即非盲)&#xff0c;基于扩散模型的逆问题求解器已经展示了最先进的性能。然而&…

linux md5sum计算hash指令

在soc启动&#xff0c;验证镜像签名时&#xff0c;会计算文件的hash值&#xff0c;确保文件未被修改&#xff0c;md5sum可以计算&#xff0c;有256,512位的的其他指令&#xff0c; 如下&#xff0c;计算文件hash值。

@PostConstruct虽好,请勿乱用

1.问题说明 在日常的业务开发中&#xff0c;有时会利用PostConstruct在容器启动时执行一些任务。例如&#xff1a; PostConstruct public void init(){System.out.println("service 初始化..............."); }一般情况这没什么问题&#xff0c;但最近一个同事在做…

Android加固为何重要?很多人不学

为什么要加固&#xff1f; APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换&#xff0c;包括不限于隐藏&#xff0c;混淆&#xff0c;加密等操作&#xff0c;进一步保护软件的利益不受损坏。总结主要有以下三方面预期效果&#xff1a; 1.防篡改&#x…

django restful framework序列化与反序列化

在前后端分离开发中&#xff0c;对于RESTfulAPI设置&#xff0c;一般需要将查询/更新数据以JSON方式进行返回。 序列化 Model.py from django.db import models class User(models.Model):username models.CharField(verbose_name用户名,max_length10)age models.IntegerF…

RT-Thread JSN-SR04T

JSN-SR0T4-2.0 超声波测距模块可提供 20cm-600cm 的非接触式距离感测功能&#xff0c;测距精度可达高到 2mm&#xff1b;模块包括收发一体的超声波传感器与控制电路组成。产品采用工业级一体化超声波探头设计&#xff0c;防水型&#xff0c;性能稳定&#xff0c;谦容市场上所有…

手搓js轮播图_JavaScript进阶

手搓js轮播图 逻辑解析html结构图片切换方法圆点导航切换效果左右箭头点击切换圆点导航点击切换自动播放&#xff0c;介入暂停 完整代码 逻辑解析 css的样式我就不再进行讲述&#xff0c;如果有需求可以评论区告诉我&#xff0c;我再出一篇文章进行详细讲解 js轮播图最主要的核…

java算法学习索引之字符串问题

一 判断两个字符串是否互为变形词 【题目】给定两个字符串str1和str2&#xff0c;如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样&#xff0c;那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。 public boolean isDeformation(String str1…

SPSS快速聚类

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

React结合antd5实现整个表格编辑

通过react hooks 结合antd的table实现整个表格新增编辑。 引入组件依赖 import React, { useState } from react; import { Table, InputNumber, Button, Space, Input } from antd;定义数据 const originData [{ key: 1, name: 白银会员, value: 0, equity: 0, reward: 0…

全球首款容器计算产品重磅发布,激活上云用云新范式

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;阿里云云原生应用平台负责人丁宇宣布&#xff0c;阿里云容器计算服务 ACS 正式发布&#xff01;ACS 将大幅降低企业和开发者用云门槛&#xff0c;真正将 Serverless 理念大规模落地。 容器计算服务 ACS&#xff0c…

零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档

一个文件夹中有多个srt视频字幕文件&#xff0c;srt文件里面有很多时间轴&#xff1a; 现在想将其批量转为word文档&#xff0c;去掉里面与字符无关的时间轴&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将SRT字幕文件转为…

jbase仪器接口设计

jbase的计划有借助虚拟M来实现连仪器&#xff0c;之前陆续写了些TCP逻辑&#xff0c;今天终于整理完成了仪器设计。首先用java的cs程序测试TCP的服务和客户端。 javafx的示例加强 package sample;import javafx.application.Application; import javafx.event.EventHandler; …

如何给shopify motion主题的产品系列添加description

一、Description是什么 Description是一种HTML标签类型&#xff0c;通过指定Description的内容&#xff0c;可以帮助搜索引擎以及用户更好的理解当前网页包含的主要了内容。 二、Description有什么作用 1、基本作用&#xff0c;对于网站和网页做一个简单的说明。 2、吸引点击&…

部署单仓库多目录项目

部署单仓库多目录项目 文章目录 部署单仓库多目录项目1.部署单仓库多目录项目2.Shell脚本进行部署单仓库多目录项目2.1 编写Shell脚本2.2 Demo推送代码及测试 3.小结 1.部署单仓库多目录项目 #部署单仓库多目录项目 在开发过程中,研发团队往往会将一个大型项目拆分成几个子目录…

Python 安装win32com失败

今天进行服务器迁移&#xff0c; 中间有用的python调用win32com组件让docx转换成pdf。不出意外的话出意外了&#xff0c;pip安装win32com的时候各种安装不上&#xff0c; 今天处理完问题之后&#xff0c;记录一下&#xff0c;与人方便与己方便。 在cmd上面&#xff0c;一开始…

opencv-图像平滑

高斯平滑 高斯平滑即采用高斯卷积核对图像矩阵进行卷积操作。高斯卷积核是一个近似服从高斯分布的矩阵&#xff0c;随着距离中心点的距离增加&#xff0c;其值变小。这样进行平滑处理时&#xff0c;图像矩阵中锚点处像素值权重大&#xff0c;边缘处像素值权重小。 import cv2 …

C语言入门——第十七课

一、二分查询 1.概念 二分查询又被称为二分查找&#xff0c;是一种在有序数组或序列中快速查找到对应元素的一种方法。每次查找范围缩小至原来的一半。 ①前提条件 数组和列表必须有序&#xff0c;否则无法进行二分查找。 ②初始化 确定查找数组和列表的左边界&#xff0…

js ::after简单实战

::after的作用是在元素后面再加个XXX样式 工作中遇到了一个表格&#xff0c;鼠标指到单元格要有个整行编辑态的效果&#xff0c;下面写个简单的demo 有人可能会说了&#xff0c;直接修改某个单元格的hover样式不就行了嘛&#xff0c;问题是如果鼠标指到单元格和单元格直接的…