VUE3.0,DAY52,全局事件总线

本文详细介绍了Vue3.0中组件间通信的两种常见方法:通过全局变量和使用原型属性。第一种方法是在main.js中定义全局变量,所有组件都能访问;第二种方法是将变量挂载到Vue的原型上,组件内部通过`this.x`访问。此外,还展示了如何利用事件总线 `$on`、`$off` 和 `$emit` 实现同级组件间的通信,通过点击按钮触发事件并传递数据,实现了参数的传递。
摘要由CSDN通过智能技术生成

组件间通信第一种写法

可以实现任意组件间的通信,所有的组件都能看的见该事件,我们在main.js中,即自定义组件外有一个x事件,代码如下:

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false
//x事件
window.x = { a: 1, b: 2 }
//创建vm
new Vue({
	el: '#app',
	render: h => h(App),
})

然后在school.vue中引用

<template>
  <div class="student">
    <h2>学生姓名:{{ name }}</h2>
    <h2>学生性别:{{ sex }}</h2>
  </div>
</template>

<script>
export default {
  name: "Student",
  data() {
    return {
      name: "张三",
      sex: "男",
    };
  },
  mounted() {
    console.log('student',window.x);
  },
};
</script>

<style  scoped>
.student {
  background-color: pink;
  padding: 5px;
  margin-top: 30px;
}
</style>

最后发现该事件成功的被响应了。
在这里插入图片描述

第二种写法

在main.js中代码,我们必须把x事件放在vue原型对象上。

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false

//全局事件x
Vue.prototype.x = { a: 1, b: 2 }
//创建vm
new Vue({
	el: '#app',
	render: h => h(App),
})

school上代码就是打印输出this.x。

<template>
  <div class="school">
    <h2>学校名称:{{ name }}</h2>
    <h2>学校地址:{{ address }}</h2>
  </div>
</template>

<script>
export default {
  name: "School",
  data() {
    return {
      name: "尚硅谷",
      address: "北京",
    };
  },
  mounted() {
    console.log('school',this.x);
  },
};
</script>

<style scoped>
.school {
  background-color: skyblue;
  padding: 5px;
}
</style>

在这里插入图片描述

调用一些$on、$off、$emit

这些符号都在组件的vue原型对象上,所以可以这样调用,在main.js上创建全局事件总线,然后在各个自定义组件内调用,随后我们还实现了同级组件间的通信。

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false

//创建vm
new Vue({
	el: '#app',
	render: h => h(App),
	beforeCreate() {
		//安装全局事件总线$bus
		Vue.prototype.$bus = this
	}
})
<template>
  <div class="student">
    <h2>学生姓名:{{ name }}</h2>
    <h2>学生性别:{{ sex }}</h2>
    <button @click="sendStudentName">把学生名给school组件</button>
  </div>
</template>

<script>
export default {
  name: "Student",
  data() {
    return {
      name: "张三",
      sex: "男",
    };
  },
  mounted() {
    // console.log("student", this);
  },
  methods: {
    //触发$bus中的你好事件
    sendStudentName() {
      this.$bus.$emit("你好",666);
    },
  },
};
</script>

<style  scoped>
.student {
  background-color: pink;
  padding: 5px;
  margin-top: 30px;
}
</style>

<template>
  <div class="school">
    <h2>学校名称:{{ name }}</h2>
    <h2>学校地址:{{ address }}</h2>
  </div>
</template>

<script>
export default {
  name: "School",
  data() {
    return {
      name: "尚硅谷",
      address: "北京",
    };
  },
  mounted() {
    //调用$on,给this.$bus绑定了一个名为你好的事件
    this.$bus.$on("你好", (data) => {
      console.log("我是school组件,收到了数据", data);
  },)}
};
</script>

<style scoped>
.school {
  background-color: skyblue;
  padding: 5px;
}
</style>

输出效果如下:点击按钮,就实现了同级组件参数传递。
在这里插入图片描述

总结

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值