首页 > 教程 > 【干货】Vue3 组件通信方式详解

【干货】Vue3 组件通信方式详解

时间:2024-06-26 | 来源: | 阅读:123

话题: v VUE 通信 E3

毫无疑问,组件通信是Vue中非常重要的技术之一,它的出现能够使我们非常方便的在不同组件之间进行数据的传递,以达到数据交互的效果。所以,学习组件通信技术是非常有必要的,本文将总结Vue中关于组件通信的八种方式,帮助大家在使用Vue的过程中更加得心应手! 如果文中有不对、疑惑的地方,欢迎在评论区留言指正

前言

毫无疑问,组件通信是Vue中非常重要的技术之一,它的出现能够使我们非常方便的在不同组件之间进行数据的传递,以达到数据交互的效果。所以,学习组件通信技术是非常有必要的,本文将总结Vue中关于组件通信的八种方式,帮助大家在使用Vue的过程中更加得心应手!

如果文中有不对、疑惑的地方,欢迎在评论区留言指正!!

一、什么是组件通信

在开始之前我们需要明白什么是组件通信, 组件通信 可以拆分为两个部分:

  • 组件
  • 通信

都知道组件是 vue 最强大的功能之一, vue 中每一个 .vue 文件我们都可以视之为一个组件,简单来说组件就是对UI结构的复用。

通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,任何信息的交通都是通信。而 组件间通信 即指组件( .vue )通过某种方式来传递信息以达到某个目的,举个栗子我们在使用 UI 框架中的 table 组件,可能会往 table 组件中传入某些数据,这个本质就形成了组件之间的通信

二、为什么要进行组件通信

通信的本质是信息同步,共享。回到vue中,每个组件之间的都有独自的作用域,组件间的数据是无法共享的但实际开发工作中我们常常需要让组件之间共享数据,这也是组件通信的目的要让它们互相之间能进行通讯,这样才能实现数据间的交互,完成某种功能的开发。

三、组件通信的分类

组件间通信的分类可以分成以下

  • 父子组件之间的通信
  • 兄弟组件之间的通信
  • 祖孙与后代组件之间的通信
  • 非关系组件间之间的通信

他们之间的关系如下图:

【干货】Vue3 组件通信方式详解

目前最常用是 props/$emit vuex/pinia ,接下来是 provide/inject ,其他不建议使用;
实际项目中,简单父子组件传递采用 props/$emit ,涉及全局共享的数据一般采用 vuex/pinia 结合存储对象 localStorage/sessionStorage 使用。

【干货】Vue3 组件通信方式详解

四、Vue3 的八种组件通信方式

  • props
  • $emit
  • expose / ref
  • $attrs
  • v-model
  • provide / inject
  • Vuex
  • mitt

五、Vue3 八种通信方式用法讲解

1. props

用 props 传数据给子组件有两种方法,如下

方法一,setup() 方法写法

// Parent.vue 传送



// Child.vue 接收

方法二,setup 语法糖

// Parent.vue 传送



// Child.vue 接收

注意:

如果父组件是setup(),子组件setup 语法糖写法的话,是接收不到父组件里 data 的属性,只能接收到父组件里 setup 函数里传的属性。

如果父组件是setup 语法糖写法,子组件setup()方法写法,可以通过 props 接收到 data 和 setup 函数里的属性,但是子组件要是在 setup 里接收,同样只能接收到父组件中 setup 函数里的属性,接收不到 data 里的属性

官方也说了,既然用了 3,就不要写 2 了,所以不推荐setup()方法写法。下面的例子,一律只用语法糖的写法。

2. $emit

// Child.vue 派发



// Parent.vue 响应


3. expose / ref

父组件获取子组件的属性或者调用子组件方法。

// Child.vue


// Parent.vue  注意 ref="comp"


4. attrs

attrs :包含父作用域里除 class 和 style 除外的非 props 属性集合

// Parent.vue 传送



// Child.vue 接收

5. v-model

可以支持多个数据双向绑定

// Parent.vue



// Child.vue


6. provide / inject

provide / inject 为依赖注入

provide :可以让我们指定想要提供给后代组件的数据或

inject :在任何后代组件中接收想要添加在这个组件上的数据,不管组件嵌套多深都可以直接拿来用

// Parent.vue


// Child.vue

7. Vuex

// store/index.js
import { createStore } from "vuex"
export default createStore({
    state:{ count: 1 },
    getters:{
        getCount: state => state.count
    },
    mutations:{
        add(state){
            state.count++
        }
    }
})

// main.js
import { createApp } from "vue"
import App from "./App.vue"
import store from "./store"
createApp(App).use(store).mount("#app")

// Page.vue
// 方法一 直接使用


// 方法二 获取

8. mitt

Vue3 中没有了 EventBus 跨组件通信,但是现在有了一个替代的方案 mitt.js,原理还是 EventBus。

先安装 npm i mitt -S

然后像以前封装 bus 一样,封装一下

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

然后两个组件之间通信的使用

// 组件 A


// 组件 B 

六、参考资料

vue.js: https://cn.vuejs.org/

vuex是什么: https://vuex.vuejs.org/zh/

工作中要使用Git,看这篇文章就够了: http://www.guosisoft.com/article/detail/410508049313861

企业数字化转型如何做?看过来: http://www.guosisoft.com/article/detail/408745545576517

Vue2.x 组件通信方式: http://www.guosisoft.com/article/detail/411234710110277

【保姆级教程】Vue项目调试技巧: http://www.guosisoft.com/article/detail/430312211521605

Vue 前端开发团队风格指南(史上最全): http://www.guosisoft.com/article/detail/415491255230533

国思RDIF低代码快速开发平台(支持vue2、vue3): http://www.guosisoft.com/article/detail/557095625134149

七、结语

如果本文对你有一点点帮助,点个赞支持一下吧,你的每一个【赞】都是我创作的最大动力 _

更多技术文章请往:

http://www.guosisoft.com/article

http://www.rdiframework.net/article

大家一起共同交流和进步呀!!

推荐

最新好玩手游

更多

手游风云榜

更多

资讯阅读

更多


湘ICP备2022002427号-10 湘公网安备:43070202000427号
© 2013~2024 haote.com 好特网