浅谈vue中$bus的使用和涉及到的问题

本文将为大家详细讲解“浅谈vue中$bus的使用和涉及到的问题”。

1. 什么是$bus

Vue.js 的事件机制中,存在一种很特殊的事件派发 / 监听模式,即使用 $on 和 $emit 方法的全局事件总线。这种模式是基于一个空的 Vue 实例作为中央事件总线的模式。

这种空的 Vue 实例被称为 $bus,$bus 实例可以被用来作为组件间传输数据的桥梁。通过 $emit 触发 $bus 中定义的事件,再通过 $on 来监听相同的事件,实现跨组件通信,达到解耦的目的。

2. 怎么使用$bus

2.1 注册事件和触发事件

通过以下代码获取 $bus 实例:

const EventBus = new Vue();

然后在需要通信的组件上的生命周期钩子方法(如 created、mounted)中注册事件:

mounted: function () {
  EventBus.$on('changeTitle', this.changeTitleFunc);
},
methods: {
  changeTitleFunc: function (title) {
    this.title = title;
  }
}

在需要向其他组件传输数据时,只需要触发相应的事件及传入事件的参数值,例如:

EventBus.$emit('changeTitle', 'new title');

2.2 销毁事件

为了避免内存泄漏和不必要的事件触发,建议在组件销毁前取消对事件的监听,如以下代码所示:

beforeDestroy: function () {
  EventBus.$off();
}

3. $bus的问题

虽然 $bus 可以帮助我们解耦组件之间的关系,但是滥用 $bus 也会引起诸多问题:

  1. 组件之间的耦合度可能增加,增加调试难度。

  2. 跨多层级组件通信时,事件名称给定可能会出现命名冲突。

  3. 多个组件注册同一事件可能会造成一个事件被重复执行多次。

因此,使用 $bus 需要适量,而非无限制的添加。需要有一个良好的组件架构设计和合理的通信设计,才能充分使用 $bus 这种模式的优势,减少它带来的副作用。

4. 示例说明

以下为两个组件之间使用 $bus 进行通信的示例说明。

4.1 父子组件间传递数据

独立的子组件可以通过 $bus 与父级组件通信,以下为父组件代码:

<template>
  <div>
    <div>{{ value }}</div>
    <child-component></child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  name: 'ParentComponent',
  data () {
    return {
      value: ''
    }
  },
  components: {
    ChildComponent
  },
  mounted () {
    EventBus.$on('emitFromChild', value => {
      this.value = value
    })
  }
}
</script>

以下为子组件代码:

<template>
    <div>
        <input type="text" v-model="value">
        <button @click="sendValue">发送</button>
    </div>
</template>
<script>
export default {
  name: 'ChildComponent',
  data () {
    return {
      value: ''
    }
  },
  mounted () {
    EventBus.$emit('emitFromChild', this.value)
  },
  methods: {
    sendValue () {
      EventBus.$emit('emitFromChild', this.value)
    }
  }
}
</script>

在子组件挂载时,就会将数据传递给父组件,父组件注册事件接收数据,渲染展示到页面中。

4.2 多个组件之间的通信

多个组件之间可以通过 $bus 通信,以下为组件1代码:

<template>
  <button @click="emitEvent">触发事件</button>
</template>
<script>
export default {
  name: 'Component1',
  methods: {
    emitEvent () {
      EventBus.$emit('event', 'msg from Component1')
    }
  }
}
</script>

以下为组件2代码:

<template>
  <div>{{ value }}</div>
</template>
<script>
export default {
  name: 'Component2',
  data () {
    return {
      value: ''
    }
  },
  mounted () {
    EventBus.$on('event', msg => {
      this.value = msg
    })
  }
}
</script>

当组件1触发事件时,组件2会收到相应的数据,渲染展示到页面中。

结束语

通过本文对 $bus 的详细讲解,相信大家已经了解了它的使用方法和注意事项,如果合理运用,可以为 Vue.js 组件之间的通信提供一种有效的解决方案。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈vue中$bus的使用和涉及到的问题 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • Vue中使用axios调用后端接口的坑及解决

    当在Vue中使用axios调用后端接口时,可能会遇到一些坑,例如跨域、请求头、响应数据处理等问题。下面是一个完整的攻略,解释了如何使用axios解决这些问题。 一、安装和引入axios 首先需要安装axios,可以使用npm或者yarn命令进行安装: npm install axios –save 或者 yarn add axios 然后在Vue项目中引入…

    Vue 2023年5月28日
    00
  • 优化Vue项目编译文件大小的方法步骤

    优化Vue项目编译文件大小是一个关键问题,对于项目的性能和用户体验都有着重要的影响。下面提供一些方法步骤,以帮助您优化Vue项目编译文件大小。 1. 使用 Webpack Bundle Analyzer Webpack Bundle Analyzer是一个可视化工具,能够查看打包后文件的大小和依赖情况,从而找出哪些包或模块对打包后的文件大小有显著影响。具体步…

    Vue 2023年5月28日
    00
  • Vue实现红包雨小游戏的示例代码

    首先我们需要了解什么是Vue.js和红包雨小游戏。 Vue.js是一个流行的JavaScript库,用于构建动态的Web应用程序。它被广泛应用于许多前端开发工程中,具有代码简洁、易于维护、高效等特点。 红包雨小游戏是一种神奇的小游戏,玩家将会在游戏中追逐红包,在一定时间内尝试抢到更多的红包。这种游戏具有趣味性和竞争性,并且可以在不同的设备上进行玩耍,如PC、…

    Vue 2023年5月27日
    00
  • 使用npm命令提示: ‘npm’ 不是内部或外部命令,也不是可运行的程序的处理方法

    这个提示表示系统无法识别npm命令,通常是由于npm环境变量配置不正确导致的。要解决这个问题,需要按照以下步骤进行操作: 检查npm是否已正确安装 首先要检查npm是否已经成功安装。可以通过执行以下命令来检查: npm -v 如果成功安装,将会输出npm的版本号,否则会显示“’npm’ 不是内部或外部命令,也不是可运行的程序”等提示。 添加npm环境变量 如…

    Vue 2023年5月27日
    00
  • Vue + Axios 请求接口方法与传参方式详解

    下面是详细讲解 “Vue + Axios 请求接口方法与传参方式详解” 的完整攻略。 简介 Vue 是一个渐进式框架,许多 web 应用程序使用它来构建 UI。Axios 是一个基于 promise 的 HTTP 库,可以用于进行数据请求。在 Vue 中,我们可以结合 Axios 在应用程序中轻松地发送数据请求。 本攻略将为您提供如何使用 Vue + Axi…

    Vue 2023年5月27日
    00
  • Vuex中状态管理器的使用详解

    Vuex中状态管理器的使用详解 什么是Vuex Vuex是一个专门为Vue.js设计的状态管理库,用于集中管理应用程序的所有组件的状态,使得数据流更加可控易管理。 为什么使用Vuex 在大型项目中,随着Vue组件越来越多,各个组件之间的数据传递变得复杂而困难。此时,使用Vuex可以帮助我们更好地组织数据、管理状态,提高代码的可维护性。 Vuex基本构成 Vu…

    Vue 2023年5月28日
    00
  • vue 中 get / delete 传递数组参数方法

    Vue中get/delete传递数组参数的方法可以采用qs库的字符串化方法或者ES6的数组API来实现。下面分别介绍两种方法的具体实现过程。 1. qs库的字符串化方法 可以通过qs库中的qs.stringify()方法将参数对象的数组属性字符串化为请求参数,或者使用qs.parse()方法将参数字符串化解析为对象。比如,我们有这样的请求参数数据: { id…

    Vue 2023年5月29日
    00
  • vue通过 API 监听数组的变化

    想要通过 API 监听 Vue.js 中的数组变化,可以使用 Vue 提供的 $watch 和 Vue.set 方法。 1. 使用 $watch 监听数组变化 在 Vue.js 中,可以通过 $watch 方法来监听数组变化。具体步骤如下: 在组件或实例中声明一个数组,例如: js data() { return { list: [“a”, “b”, “c”…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部