vue常用组件通信方式及vue2和vue3写法对比(下)

简介: vue常用组件通信方式及vue2和vue3写法对比(下)

2. 隔代组件通信


2.1 provide/inject


provide / inject 为依赖注入,该方法用于父子组件、隔代组件之间的通信,即在层数很深的情况下,可以使用这种方法来进行传值。就不用一层一层的传递了。

provide / inject是Vue提供的两个钩子,和data、methods是同级的。并且provide的书写形式和data一样。


provide 用来发送数据或方法

inject 用来接收数据或方法


vue2写法


// 父组件
export default{
    provide(){
        return {
            msg: this.msg 
        }
    }
}
// 后代组件
export default{
    inject:["msg"]
}

要注意的是 provide 和 inject 传递的数据不是响应式的,也就是说用 inject 接收来数据后,provide 里的数据改变了,后代组件中的数据不会改变。


vue3写法

// Parent.vue
<script setup>
    import { provide } from "vue"
    provide("name", "小心")
</script>
// Child.vue
<script setup>
    import { inject } from "vue"
    const name = inject("name")
    console.log(name) //小心
</script>


3. 兄弟组件通信


3.1 eventBus事件总线


eventBus事件总线,本质是通过创建一个空的 Vue 实例来作为消息传递的对象,通过$on监听事件,通过$emit触发事件,适用于父子、隔代、兄弟组件通信。


vue2写法

1.创建事件中心管理组件之间的通信

// main.js
import Vue from "vue"
Vue.prototype.$bus = new Vue()

2.通过emit触发自定义事件

//兄弟组件A 发送数据
<template>
    <button @click="handlerClick">按钮</button>
</template>
export default{
    methods:{
        handlerClick(){
            // 自定义事件名 sendMsg
            this.$bus.$emit("sendMsg", "这是要向外部发送的数据")
        }
    }
}

3.通过on监听事件

//兄弟组件B 接受数据
export default{
    mounted(){
        // 监听事件的触发
        this.$bus.$on("sendMsg", data => {
            console.log("这是接收到的数据:", data)
        })
    },
    beforeDestroy(){
        // 取消监听
        this.$bus.$off("sendMsg")
    }
}

vue3写法

Vue3中移除了eventBus,但可以借助mitt插件来实现代替,原理还是 EventBus。

1.首先需要安装插件

npm install --save mitt

2.创建总线对象

//mitt.js
import mitt from 'mitt'
const mitt = mitt()
export default mitt

3.通过emit方法触发自定义事件,on方法监听事件


// 组件 A
<script setup>
import mitt from './mitt'
const handleClick = () => {
    mitt.emit('handleChange')
}
</script>
// 组件 B 
<script setup>
import mitt from './mitt'
import { onUnmounted } from 'vue'
const someMethed = () => { ... }
mitt.on('handleChange',someMethed)
onUnmounted(()=>{
    mitt.off('handleChange',someMethed)
})

参考mitt官网


3.2 Vuex/Pinia


使用Vuex或Pinia状态管理器,集中式存储管理所有组件的状态,实现任意组件间的通信。


vuex核心概念:state、mutations、actions、getters、modules

pinia核心概念:state、actions、getters。没有mutation、modules。

用法可以参考:Pinia官网,Vuex官网。这里就不再具体展开。


结语


本文结合vue2和vue3写法对比,总结了vue中组件通信常用的几种方式。


父子组件:props / $emit、 ref / $parent

隔代组件:provide / inject、eventBus、Vuex / Pinia

兄弟组件:eventBus、Vuex / Pinia

写作不易,你的一赞一评,就是我前行的最大动力。如有问题,欢迎指出!


相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
300 2
|
1月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
279 137
|
1月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
490 139
|
1月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
204 1
|
2月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
365 11
|
1月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
247 0
|
3月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
424 1
|
3月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
239 0
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
259 0
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
767 0