码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Vue bus事件总线的原理与使用


    这里写自定义目录标题

    • 一、 Vue Bus 总线原理
    • 二、Vue bus的使用
        • 1、创建总线: 在 Vue 应用中,可以创建一个 Vue 实例作为总线,用于管理事件。
        • 2、事件的发布与订阅: 组件通过订阅事件来监听总线上的消息,而其他组件则通过发布事件来触发消息。
        • 3、销毁总线: 在组件销毁时,应该取消对事件的订阅以防止内存泄漏。
        • 4、注意:
    • 三、Vue bus 实际应用
        • 场景
        • 示例代码

    一、 Vue Bus 总线原理

    Vue Bus 是一种事件总线的实现方式,用于在不同组件之间进行通信。在 Vue 应用中,父子组件通信相对简单,但当需要在非父子关系的组件之间进行通信时,就需要借助一种中央事件总线的机制,这就是 Vue Bus 的作用。
    在这里插入图片描述
    说白就是建一个空白的vue,里面只处理 $emit 事件发布、$on事件监听触发 以及 $off 事件销毁,来完成多层不同组件之间的通行。

    二、Vue bus的使用

    1、创建总线: 在 Vue 应用中,可以创建一个 Vue 实例作为总线,用于管理事件。

    // bus.js
    import Vue from 'vue';
    export const bus = new Vue();
    
    • 1
    • 2
    • 3

    2、事件的发布与订阅: 组件通过订阅事件来监听总线上的消息,而其他组件则通过发布事件来触发消息。

    // ComponentA.vue
    import { bus } from './bus.js';
    
    export default {
      methods: {
        handleClick() {
          bus.$emit('custom-event', 'Hello from Component A!');
        },
      },
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    // ComponentB.vue
    import { bus } from './bus.js';
    
    export default {
      mounted() {
        bus.$on('custom-event', (message) => {
          console.log(message); // Hello from Component A!
        });
      },
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、销毁总线: 在组件销毁时,应该取消对事件的订阅以防止内存泄漏。

    // ComponentB.vue
    export default {
      beforeDestroy() {
        bus.$off('custom-event');
      },
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、注意:

    1. bus总线的on执行先与emit
      原因:父子生命周期顺序的影响,父beforeCreate-父created-父beforeMount-子beforeCreate-子created-子beforeMount-子mounted-父mounted
    2. bus总线的emit不适宜写在creted中,要写在mounte钩子函数中。
      原因:on是要早于emit,而且受父子生命周周期的影响,emit要写在nounted函数里。
    3. 发布事件在使用完后,记得off 注销事件,防止内存泄漏。

    三、Vue bus 实际应用

    场景

    考虑一个购物车的应用,有一个商品列表组件和一个购物车组件,它们之间需要实现添加商品到购物车的功能。

    示例代码

    <!-- ProductList.vue -->
    <template>
      <div>
        <div v-for="product in products" :key="product.id">
          <p>{{ product.name }}</p>
          <button @click="addToCart(product)">Add to Cart</button>
        </div>
      </div>
    </template>
    
    <script>
    import { bus } from './bus.js';
    
    export default {
      data() {
        return {
          products: [
            { id: 1, name: 'Product A' },
            { id: 2, name: 'Product B' },
            { id: 3, name: 'Product C' },
          ],
        };
      },
      methods: {
        addToCart(product) {
          bus.$emit('add-to-cart', product);
        },
      },
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    <!-- ShoppingCart.vue -->
    <template>
      <div>
        <h2>Shopping Cart</h2>
        <ul>
          <li v-for="item in cartItems" :key="item.id">
            {{ item.name }}
          </li>
        </ul>
      </div>
    </template>
    
    <script>
    import { bus } from './bus.js';
    
    export default {
      data() {
        return {
          cartItems: [],
        };
      },
      mounted() {
        bus.$on('add-to-cart', (product) => {
          this.cartItems.push(product);
        });
      },
      beforeDestroy() {
        bus.$off('add-to-cart');
      },
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这个例子中,ProductList 组件通过 Vue Bus 发送了一个 ‘add-to-cart’ 事件,而 ShoppingCart 组件监听了这个事件,并在事件发生时将商品添加到购物车中。

    这就是 Vue Bus 的基本原理和一个实际应用的例子。通过这种方式,不同组件之间可以更轻松地进行通信,提高了组件之间的灵活性和复用性

  • 相关阅读:
    打印nxn方阵
    EdrawMax思维导图,EdrawMax组织结构图
    【最全】PS各个版本下载安装及小试牛刀教程(PhotoShop CS3 ~~ PhotoShop 2022)
    如何使用libswscale库将YUV420P格式的图像序列转换为RGB24格式输出?
    java开发常用的工具以及配置类
    Java中List如何转数组呢?
    Kotlin学习(一)
    平面点云,边界提取
    利用ChatGPT进行数据分析并生成数据分析报告
    三种docker可视化工具(全网最详细)
  • 原文地址:https://blog.csdn.net/weixin_44786330/article/details/134456550
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号