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

yizhihongxing

本文将为大家详细讲解“浅谈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.js第二天学习笔记(vue-router)

    Vue.js第二天学习笔记(vue-router) Vue-router 是 Vue.js 官方的路由插件,它和 Vue.js 的核心深度集成,可以非常方便地进行 Web 应用程序的路由控制管理。在学习 Vue.js 前端开发过程中,理解和掌握 Vue-router 的使用是非常重要的。 安装与引用 安装 Vue-router 可以使用 npm 或者引用 C…

    Vue 2023年5月27日
    00
  • vue.js将unix时间戳转换为自定义时间格式

    Sure,下面我将详细讲解“vue.js将unix时间戳转换为自定义时间格式”的攻略。在开始讲解之前,我们需要先明白什么是Unix时间戳。 Unix时间戳是指从1970年1月1日00:00:00以来的秒数,常用于记录事件的时间。在Vue.js中,我们通常会遇到将Unix时间戳转换为自定义时间格式的需求。其中,自定义时间格式可以是任何需要的日期时间格式。 下面…

    Vue 2023年5月29日
    00
  • vue form表单post请求结合Servlet实现文件上传功能

    要实现vue form表单post请求结合Servlet实现文件上传功能,需要经历以下几个步骤: 在前端使用vue构建表单,确保表单中包含文件上传控件 <template> <form enctype="multipart/form-data" method="post" action="&…

    Vue 2023年5月27日
    00
  • Vue中通过Vue.extend动态创建实例的方法

    让我来为您讲解一下在Vue中通过Vue.extend动态创建实例的方法。 Vue.extend方法 Vue.extend方法是Vue的一个全局API,用于创建一个Vue组件构造器,并返回该构造器。通过Vue.extend方法创建的组件构造器可以像普通的Vue组件一样进行注册、传值、生命周期等操作。 创建Vue组件构造器 首先我们需要通过Vue.extend方…

    Vue 2023年5月28日
    00
  • 基于vue-cli3+typescript的tsx开发模板搭建过程分享

    下面详细讲解在vue-cli3和typescript环境下如何搭建tsx模板的开发环境。 创建一个新项目 首先,我们需要安装vue-cli3脚手架工具,可以使用npm或yarn安装。 npm install -g @vue/cli # 或者 yarn global add @vue/cli 安装完成后,我们使用vue-cli3创建一个新的项目,选择手动配置选…

    Vue 2023年5月27日
    00
  • Vue3通过ref操作Dom元素及hooks的使用方法

    现在我来为你详细讲解“Vue3通过ref操作Dom元素及hooks的使用方法”的完整攻略。 1. 关于Vue3的Ref 在Vue3中,ref函数用于创建一个响应式的对象,该对象的值可以跨越组件之间进行传递和更新。它的语法如下: const foo = ref(initialValue) 其中,initialValue可以是任何JavaScript类型的初始值…

    Vue 2023年5月28日
    00
  • vue+axios实现文件下载及vue中使用axios的实例

    下面我将详细介绍“vue+axios实现文件下载及vue中使用axios的实例”的完整攻略。 1. 使用axios实现文件下载 使用axios实现文件下载的过程比较简单,只需要在axios请求中设置responseType: ‘blob’,同时将后端返回的数据保存为文件即可。 下面是一个示例,首先我们需要一个按钮来触发文件下载: <template&g…

    Vue 2023年5月28日
    00
  • vue之数据交互实例代码

    下面我将详细讲解“vue之数据交互实例代码”的完整攻略。首先,请确认您已经了解 Vue.js 的基础知识。 标题 一、前言 数据交互是 Web 开发中最为常见的需求之一,而 Vue.js 提供了轻松的途径实现数据交互。以前是通过 jQuery 来实现数据交互的,但是 Vue.js 的出现,为我们提供了一种更优秀的数据交互解决方案。 二、Vue.js 的数据交…

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