Vue3实现非父子组件通信

父传子接:props
子传父接:$emit发送自定义事件,注意在vue3中要在emits选项中定义自定义事件

vue3中取消了$on,$off,$once, 不能使用事件总线的方式了

方式一:provide/inject

定义要发送的数据:provide
定义接收的数据:inject

// 父组件传递数据
  provide: {
    msg: "我是小仙女",
    emotion: "超级开心"
  }

//接收数据的组件
inject:['msg','emotion']

注意:provide中定义的数据不能在本组件中使用

一般provide最好写成一个函数返回一个对象,可以获取到data中的数据。要想provide中数据变成响应式的,用computed包裹。

import {computed} from 'vue'

// 向非父组件传递数据
  provide() {
    return {
      msg: "我是小仙女",
      emotion: "超级开心",
      numsLength: computed(() => this.nums.length)
    };
  },
 data() {
    return {
      nums: [1, 2, 3],
    };
  },

方式二:使用mitt库

安装mitt

npm install mitt

封装一下,文件utils/mitt.js

import mitt from "mitt";
const bus = mitt()
export default bus

层级关系:subChild1<Child1 <App.vue
App.vue和subChild1通信

App.vue 传递数据

<template>
  <child1></child1>
  <button @click="send">send</button>
</template>

<script>
import Child1 from "./Child1.vue";
import bus from "./utils/mitt";
export default {
  components: {
    Child1
  },
  data() {
      return {
          message:'你好吖'
      }
  },
  methods: {
    send() {
      bus.emit("send", this.message);//发送数据
    }
  }
};
</script>

subChild1.vue 接收数据

<template>
  <div>{{text}}</div>
</template>

<script>
import bus from './utils/mitt'
export default {
    name:'SubChild1',
    data() {
        return {
            text:''
        }
    },
    created() {
        bus.on('send',(data) =>{// 接收数据
            this.text = data
        })
    },
}
</script>

发送数据:bus.emit('‘事件类型”,数据)
接收数据:bus.on(’'事件类型”,回调函数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值