非父子通信-event bus 事件总线-provide inject

1.作用

非父子组件之间,进行简易消息传递。(复杂场景→ Vuex)

2.步骤

创建一个都能访问的事件总线 (空Vue实例)

import Vue from 'vue'
const Bus = new Vue()
export default Bus

A组件(接受方),监听Bus的 $on事件

created () {
  Bus.$on('sendMsg', (msg) => {
    this.msg = msg
  })
}

B组件(发送方),触发Bus的$emit事件(可以被多个接收方接收)

Bus.$emit('sendMsg', '这是一个消息')

3.代码示例

BaseA.vue(接受方)

<template>
<div class="BaseA">
  我是A组件(接收方)
  <p>{{mse}}</p>
</div>
</template>

<script>
import Bus from "../util/EventBus";
export default {
  name: "BaseA",
  created() {
    Bus.$on('mse',(msg)=>{
      this.mse=msg
    })
  },
  data(){
    return{
      mse:''
    }
  }
}
</script>

<style scoped>
.BaseA {
  width: 200px;
  height: 200px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
</style>

BaseB.vue(发送方)

<template>
<div class=" BaseB">
  <div>我是B组件(发布方)</div>
  <button @click="sendMse">发送消息</button>
</div>
</template>

<script>
import Bus from "../util/EventBus";
export default {
  name: "BaseB",
  methods:{
    sendMse(){
      Bus.$emit('mse','今天天气不错')
    }
  }
}
</script>

<style scoped>
.BaseB {
  width: 200px;
  height: 200px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
</style>

App.vue

<template>
<div>
  <BaseA></BaseA>
  <BaseB></BaseB>
</div>
</template>

<script>

import BaseA from "@/components/BaseA.vue";
import BaseB from "@/components/BaseB.vue";
export default {
  name: 'App',
  components: {
    BaseA,
    BaseB
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

4.效果

5、非父子通信-provide&inject

1.作用

跨层级共享数据

2.场景

 

3.语法

  1. 父组件 provide提供数据

export default {
  provide () {
    return {
       // 普通类型【非响应式】
       color: this.color, 
       // 复杂类型【响应式】
       userInfo: this.userInfo, 
    }
  }
}

2.子/孙组件 inject获取数据

export default {
  inject: ['color','userInfo'],
  created () {
    console.log(this.color, this.userInfo)
  }
}

4.注意

  • provide提供的简单类型的数据不是响应式的,复杂类型数据是响应式。(推荐提供复杂类型数据)

  • 子/孙组件通过inject获取的数据,不能在自身组件内修改

5.效果

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值