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

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

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

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

1,全局自定义指令

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

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

1.1 创建组件的执行函数

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

       image.gif编辑

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');
      },
  },
};

image.gif

      📓如上方所示,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");

image.gif

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

1.4 在页面上使用

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

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

image.gif

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

1.5 获取元素的dom,并修改

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

image.gif

看下页面上显示的结果

image.gif

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

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

image.gif

📓这时候还是有些不够的,假设,我们想实现一个@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>

image.gif

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

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

image.gif

📓这样,我们的自定义指令也有和@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>

image.gif

image.gif


相关文章
|
1月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
130 64
|
1月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
112 60
|
5天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
24 3
|
1月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
35 8
|
1月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
32 1
|
1月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
39 1
|
1月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
41 0
|
JavaScript 数据安全/隐私保护
Vue:几个实用的 Vue 自定义指令
Vue:几个实用的 Vue 自定义指令
117 0
Vue:几个实用的 Vue 自定义指令
|
10天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。

热门文章

最新文章