Vue组件非父子组件通讯

举报
学海无涯yc 发表于 2022/08/06 19:01:04 2022/08/06
【摘要】 文章目录1.provide和inject1.1基本使用1.2如何处理响应式数据2.全局事件总线mitt库2.1安装mitt库,封装eventbus.js工具类2.2在其中一个组件中触发事件2.2在该组件的兄弟组件或者兄弟组件的子组件中监听该事件1.provide和injectprovide/inject主要适用于在一些深入嵌套的组件中,子组件想要获取父组件的部分内容的情况,此时可以在父组件中...


1.provide和inject

provide/inject主要适用于在一些深入嵌套的组件中,子组件想要获取父组件的部分内容的情况,此时可以在父组件中使用provide来提供数据,在子组件中使用inject来获取并使用这些数据(我们可以将依赖注入看作是“长距离的 prop”)

在这里插入图片描述

1.1基本使用

//父组件
   data(){
     return{
       books:['javascript', 'vue', 'vite']
     }
   },
   provide(){
     return{
       name:'lili',
       age:25,
       todoLength: this.books.length
     }
   }
//子组件
   <h2>{{name}}-{{age}}</h2>
   <h2>{{todoLength.value}}</h2>
   inject:['name', 'age', 'todoLength']
  • 打印结果如下:在这里插入图片描述

1.2如何处理响应式数据

但是当我们父组件中的数据需要实时进行更改时,就会发现子组件不会发生相应的变化

//父组件
<button @click="btnClick">按钮</button>
methods:{
     btnClick(){
       this.books = ['javascript', 'vue']
     }
   }
  • 打印结果如下:
    在这里插入图片描述

点击按钮,从父组件中传入的todoLength长度仍为3,这是因为在provide中引入的this.books.length本身并不是响应式的,所以我们可以使用一些响应式的API来完成这些功能,比如computed函数。而且在调用的时候,因为computed返回的是一个ref对象,我们要取出value属性来使用。

//父组件
import {computed} from 'vue'
  export default {
    provide(){
      return{
        name:'lili',
        age:25,
        todoLength: computed(() => this.books.length)
      }
    },
<h2>{{todoLength.value}}</h2>
  • 打印结果如下:
    在这里插入图片描述

2.全局事件总线mitt库

全局事件总线可以用于非父子组件之间的通信,如与兄弟组件或者兄弟组件的子组件进行通信。在Vue3中,我们可以使用第三方库mitt来使用全局事件总线

在这里插入图片描述

2.1安装mitt库,封装eventbus.js工具类

npm install mitt
import mitt from 'mitt';
const emitter = mitt();
export default emitter;

2.2在其中一个组件中触发事件

import emitter from './utils/eventbus'
export default {
  methods:{
    btnClick(){
      console.log('about发生点击');
      emitter.emit('kobe', {name:'kobe', height:198})
    }
  }
}

2.2在该组件的兄弟组件或者兄弟组件的子组件中监听该事件

import emitter from './utils/eventbus'
  export default {
    created(){
      emitter.on('kobe', (info)=>{
        console.log("best player:", info)
      })
    }
}
  • 打印结果:
    在这里插入图片描述

未完待续。。。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。