VUE不同页面间的传值之EventBus传递的值不显示

VUE不同页面间的传值之EventBus传递的值不显示


EventBus称为事件总线。
EventBus就如同公交车,通过’$emit’让乘客(即所要传递的值)在发出地上车,在目的地通过’$on’使乘客下车。
1.初始化
方法1
首先需要创建EventBus.js并将其导出,以便其它模块可以使用或者监听它。

import Vue from 'vue'
export const EventBus = new Vue()

方法2
直接在main.js文件中加入

Vue.prototype.$EventBus = new Vue()

注:法2未使用过
2.发送事件
home页面

<template>
  <div class="home">
    home
    <h2>这是在home中本身的data数据:{{ name }}</h2>
    <button @click="fire()">点击发射</button>
  </div>
</template>

<script>
import { EventBus } from "./eventbus.js";

export default {
  name: "Home",
  components: {},
  data() {
    return {
      name: "张三",
    };
  },
  methods: {
    fire() {
    //在$emit中第一个参数为自定义事件名,第二个参数为要传递的值
      EventBus.$emit("fireName", this.name);
      console.log(this.name);
    },
  },
};
</script>

在这里插入图片描述
3.接收事件
about页面

<template>
  <div class="about">
      <h1>This is an about page</h1>
      <h2>这是home发射过来的name:{{ newname }}</h2>
  </div>
</template>

<script>
import { EventBus } from "./eventbus.js";

export default {
  name: "About",
  data() {
    return {
      newname: "李四",
    };
  },
  created() {
  //注意此处的值第一个参数要与发出组件中$emit的第一个参数相同
    EventBus.$on("fireName", (message) => {
      this.newname = message;
    });
  },
};
</script>

在这里插入图片描述
当点击按钮后有两种情况,如果你两个组件在同一页面,李四变张三。不在同一页面,李四未变成张三。
但是可以获取到name的值,就是传不到about页面中。
在这里插入图片描述

最先开始以为是页面刷新,将数据也刷新了,没有传递过来。然后用了keep-alive,结果然并卵。只能百度,了解到与组件的生命周期有关。
新组件:beforeCreate

新组件:created

新组件:beforeMount

旧组件:beforeDestroy

旧组件:destroyed

新组件:mounted
由此可以了解到你要在新组件dom挂载前将值传出来。
即你要在home页面中添加,二者选其一

// destroyed() {
  //   this.fire();
  // },
  beforeDestroy () {
     this.fire();
  }

在about页面中添加,二者选其一,只要别在挂载完成后执行就可以了

  // beforeMount () {
  //   EventBus.$on("fireName", (message) => {
  //     this.newname = message;
  //   });
  // },
  created () {
     EventBus.$on("fireName", (message) => {
      this.newname = message;
    });
  }

最终结果显现:张三来到了about页面
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue中,可以通过使用事件总线(Event Bus)来实现子组件向父组件传递,同时子组件也可以修改父组件的。下面是一些基本步骤和注意事项: 1. 在父组件中,首先需要创建一个事件总线对象,可以在全局范围内使用。可以使用Vue实例对象来创建事件总线对象,并将其导出,以便在其他组件中使用。 ```php // 在父组件中 import eventBus from './eventBus' export default { methods: { init() { // 创建事件总线对象并导出 this.$eventBus = eventBus }, // 其他方法... } } ``` 然后在需要传递事件和接收事件的组件中导入和使用事件总线对象。 2. 在子组件中,可以通过事件总线对象来发布事件和接收事件。例如,可以使用`$emit`方法来发布事件,并传递需要传递。 ```php // 子组件中 this.$eventBus.$emit('eventName', value) ``` 在父组件中,可以使用`$on`方法来监听子组件发布的事件,并获取传递。 ```php // 父组件中 this.$eventBus.$on('eventName', (value) => { // 处理从子组件传递过来的 }) ``` 注意:在使用事件总线时,应该避免在循环中触发事件,因为这可能会导致无限循环。同时,为了避免内存泄漏,应该使用Vue提供的清理机制来销毁不再使用的实例对象。 3. 子组件可以通过修改父组件的来响应某些事件。例如,当父组件接收到子组件发布的事件后,可以根据需要修改父组件的。可以使用Vue的响应式机制来实现这一功能。在父组件中,使用`watch`选项来监听子组件传递,并在需要时更新父组件的。 以上是Vue中使用事件总线实现子组件向父组件传递和子组件修改父组件的基本步骤和注意事项。需要注意的是,在使用事件总线时应该注意避免循环引用和内存泄漏问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值