浅谈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日

相关文章

  • axios 实现post请求时把对象obj数据转为formdata

    将对象数据转为FormData格式主要是为了方便传递文件或图片等二进制数据,而axios是一个流行的Promise based HTTP库,它可以支持多种请求,如GET、POST等。接下来,我将详细讲解如何在axios实现post请求时将对象数据转为FormData格式,并包含两条示例。 实现步骤 导入axios库 在使用前需要先导入axios库,可以使用以…

    Vue 2023年5月28日
    00
  • vue 多入口文件搭建 vue多页面搭建的实例讲解

    下面是详细讲解”vue 多入口文件搭建 vue多页面搭建的实例讲解”的攻略: 1. 前置条件 为了搭建 Vue 多入口文件,你需要确保以下工具 已经安装: Node.js:安装最新版本代码和 npm 包 Vue CLI:用于创建 Vue 应用程序的命令行工具 2. 创建 Vue 应用程序 使用 Vue CLI 创建一个新的 Vue 应用程序: vue cre…

    Vue 2023年5月28日
    00
  • Vue生命周期区别详解

    首先,需要了解Vue的生命周期是什么。Vue生命周期是Vue实例从创建到销毁的过程,在其中它会依次经过不同的状态和调用不同的钩子函数。Vue的生命周期分为8个阶段,分别是: beforeCreate: 在实例初始化之后,数据观测和初始化事件之前调用。 created: 在实例创建完成后调用,此阶段完成了数据观测和属性计算,但尚未开始真正的DOM相关操作。 b…

    Vue 2023年5月28日
    00
  • 学习Vue框架中必掌握的重点知识

    学习Vue框架中必掌握的重点知识 组件基础 Vue的组件是Vue应用的基本模块。组件是可复用的,Vue应用将一个页面划分为多个组件并组成组件树。组件是拥有自己的状态和生命周期的可复用模块。了解组件的定义、注册、渲染以及组件之间的通信是掌握Vue的关键。 组件的定义和注册 组件的定义是通过Vue.extend()和Vue.component()方法来实现的。V…

    Vue 2023年5月28日
    00
  • Vue实现附件上传功能

    如何使用Vue实现附件上传功能?下面是一个完整的攻略: 1. 安装依赖 在使用Vue实现附件上传功能之前,需要安装和配置相关依赖。 首先,在项目中安装axios这个库。axios是一个HTTP客户端,主要用于处理跨域请求和在浏览器和Node.js中发送HTTP请求。 在命令行中输入以下命令来安装axios: npm install axios 然后,在项目中…

    Vue 2023年5月28日
    00
  • vue-cli2.9.3 详细教程

    Vue CLI2.9.3 详细教程 Vue CLI2.9.3 是一个由 Vue 官方提供的命令行工具,用于快速搭建基于 Vue.js 的项目和 SPA 应用,可根据用户的选择预设一套规范的项目目录结构、开发规范、自动化构建及相关依赖库等。本教程将详细介绍如何使用 Vue CLI2.9.3 进行项目搭建以及配置。 安装 Vue CLI 命令行工具 首先,需要使…

    Vue 2023年5月27日
    00
  • 关于Vue3中的响应式原理

    关于Vue3中的响应式原理,可以从以下几个方面讲解: 1. Vue3响应式的基本原理 在Vue3中,响应式的实现主要使用了ES6中新增的Proxy对象来进行拦截。当我们访问一个响应式对象的属性时,这个属性会被代理对象拦截,然后执行对应的操作(如读取、修改等),进而触发对应的更新逻辑。 下面是一个简单的示例: import { reactive } from …

    Vue 2023年5月28日
    00
  • VUE异步更新DOM – 用$nextTick解决DOM视图的问题

    VUE是一个流行的JavaScript框架,具有数据驱动和组件化的特点。然而,当我们在处理DOM视图时,有时候可能会出现异步更新的问题。这会导致我们的DOM视图没有及时更新,从而导致一些错误。在这种情况下,我们可以使用Vue提供的$nextTick方法来解决DOM视图异步更新的问题。 什么是异步更新DOM 在Vue中,组件的DOM操作是异步执行的。这意味着当…

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