码农知识堂 - 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 的基本原理和一个实际应用的例子。通过这种方式,不同组件之间可以更轻松地进行通信,提高了组件之间的灵活性和复用性

  • 相关阅读:
    基于AvaSpe 2048测定物体的光谱曲线
    webpack基础
    生成指定范围内的指定个数的随机整数numpy.random.randint()
    【Qt秘籍】[005]-Qt的首次邂逅-创建
    二、Javascript类型[数组、对象]
    嵌入式-数据进制之间的转换
    Flink CDC
    Kodi+Alist v3 挂载阿里云盘他人分享链接打造在线影视库
    【多区域电力系统模型】三区域电力系统的LQR和模糊逻辑控制(Matlab代码实现)
    Module Parameters
  • 原文地址:https://blog.csdn.net/weixin_44786330/article/details/134456550
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号