vue3 常用的组件互相通信(父子、兄弟、爷孙、任意组件) ...

海哥  金牌会员 | 2024-6-21 13:35:44 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 534|帖子 534|积分 1602

目次
前言:现在组件通信方法有好多种,我这挑选一部分来讲
1、父传子
2、子传父
3、兄弟之间通信
3.1、父组件充当中央件
3.2、全局事件总线—EventBus
4、爷孙之间通信
5、任意组件、全局


前言:现在组件通信方法有好多种,我这挑选一部分来讲

方案父传子子传父props / emitspropsemitsv-model / emitsv-modelemitsref / emitsrefemitsprovide / injectprovideinjectEventBusemit / on(可用于兄弟、爷孙、全局)emit / on(可用于兄弟、爷孙、全局)Vuex作用于全局作用于全局pinia作用于全局作用于全局

















1、父传子

紧张用到props属性转达,父组件通过自定义属性给子组件传值,子组件用props接收
示例:

 子组件 TitleMore.vue 
  1. // 子组件
  2. <template>
  3.     <span class="pub-title">{{ title }}</span>
  4. </template>
  5. <script setup>
  6. // defineProps 可以直接使用,不需要另外引入
  7. /**
  8. * @property {String} title  标题
  9. */
  10. const props = defineProps({
  11.     title: {
  12.         type: String,
  13.         default: "",
  14.     },
  15. })
  16. </script>
复制代码
父组件 
  1. <template>
  2.     <title-more title="基本信息" />
  3. </template>
  4. <script setup>
  5. import TitleMore from "@components/TitleMore.vue"
  6. </script>
复制代码
2、子传父

 子组件 
  1. // 子组件
  2. <template>
  3.     <span class="pub-title" @click="onClick">{{ title }}</span>
  4. </template>
  5. <script setup>
  6. // defineEmits 可以直接使用,不需要另外引入
  7. const emits = defineEmits(["click"])
  8. const onClick = () => {
  9.     emits("click",'123')
  10. }
  11. </script>
复制代码
 父组件 
  1. <template>
  2.     <title-more title="基本信息" @click="handleClick" />
  3. </template>
  4. <script setup>
  5. import TitleMore from "@components/TitleMore.vue"
  6. const handleClick = (val) => {
  7.     console.log('val',val)
  8. }
  9. </script>
复制代码
3、兄弟之间通信



  • 一种方法是父组件允当两个子组件之间的中央件
  • 全局事件总线—EventBus(可以用于兄弟、爷孙、任意组件通信)
3.1、父组件充当中央件

假设有A、B、C页面,其中A、B为兄弟组件、C为父组件
 A组件 
  1. // A组件
  2. <template>
  3.     <span class="pub-title">{{ title }}</span>
  4. </template>
  5. <script setup>
  6. const props = defineProps({
  7.     title: {
  8.         type: String,
  9.         default: "",
  10.     },
  11. })
  12. </script>
复制代码
 B组件 
  1. // B组件
  2. <template>
  3.     <span class="pub-title" @click="onClick">12</span>
  4. </template>
  5. <script setup>
  6. const emits = defineEmits(["click"])
  7. const onClick = () => {
  8.     emits("click",'123')
  9. }
  10. </script>
复制代码
 C组件(父组件) 
  1. <template>
  2.     // A组件
  3.     <other :title="title" />   
  4.     // B组件
  5.     <title-more @click="handleClick" />
  6. </template>
  7. <script setup>
  8. import { ref } from "vue"
  9. import TitleMore from "@components/TitleMore.vue"
  10. const title = ref('')
  11. const handleClick = (val) => {
  12.     title.value = val
  13.     console.log('val',val)
  14. }
  15. </script>
复制代码
3.2、全局事件总线—EventBus

  1. // 安装
  2. npm install mitt -S
复制代码
assets新建个common文件夹,接着再创建event-bus.js(这个文件定名根据你们的环境来定)
  1. // event-bus.js
  2. import mitt from "mitt";
  3. const EventBus = mitt()
  4. export default EventBus
复制代码
 父组件 
  1. <template>
  2.     <span @click="onClick"></span>
  3. </template>
  4. <script setup>
  5. import { ref } from "vue"
  6. import EventBus from "@common/event-bus"
  7. const onClick = () => {
  8.     EventBus.emit("p-click", '父传子文本信息');
  9. }
  10. </script>
复制代码
 子组件 
  1. <template>
  2.     <span>{{ text }}</span>
  3. </template>
  4. <script setup>
  5. import { ref,onBeforeUnmount } from "vue"
  6. import EventBus from "@common/event-bus"
  7. const text = ref('')
  8. // 第一种
  9. EventBus.on('p-click', (val)=>{
  10.   text.value = val
  11.   console.log('获取的值val','val')
  12. })
  13. // 另一种写法
  14. const funs = (xxx) =>{
  15.     console.log('接收的值为',xxx)
  16. }
  17. EventBus.on('p-click',funs)
  18. EventBus.off('p-click',funs)
  19. onBeforeUnmount(() => {
  20.     // 取消单个监听-第一种
  21.     EventBus.off('p-click')
  22.    
  23.     // 全部取消
  24.     EventBus.all.clear()
  25. })
  26. </script>
复制代码
4、爷孙之间通信



  • provide/inject
  • EventBus
eventBus上述有讲过这里就不讲了,讲一下provide/inject
 父组件 
  1. import { reactive,provide,ref } from 'vue';
  2. provide('page', ref('1'))
  3. provide('user', reactive({
  4.   age: 11,
  5.   name: '张三'
  6. }))
复制代码
  子组件 
  1. import { inject } from 'vue';
  2. const user = inject("user");
  3. const page = inject("page");
复制代码
爷孙组件无论任何一个组件内的值发生改变,两个组件的值都会举行相应式的数据更新。
5、任意组件、全局



  • provide/inject
  • EventBus
  • Vuex
  • Pinia

扩展:
vue2/vue3 EventBus事件总线(用于组件通信) 
vue2/vue3 Provide和Inject利用方式​​​​​​​ 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表