zoukankan      html  css  js  c++  java
  • VUe兄弟通信

    用过Vue,你肯定知道,Vue组件之间的通信常见的有
    $dispatch - 通过冒泡的方式传递事件
    $broadcast - 通过广播的方式向子孙组件传递事件

    如果组件之间的关系只是父-子关系,那么dispatch,broadcast其实就足够了。
    但是有天需求变了。登录成功之后,要把用户信息都填上,而需要用户信息的组件不是父组件,而是兄弟组件的后台。
    那么事件传递就会变成登录组件向上dispatch到父组件,父组件通过broadcast的方式下发。

    example

    example



    当然,这个简单的例子不足够证明这样的传递有多糟糕。随着项目和项目成员的壮大,这样的组件通信越多,越不好维护。
    所以官方推出了Vuex
    vuex

    vuex


    Vuex会让你的Vue代码足够灵活可控,把数据统一存入state, 只允许通过Actions触发Mutations修改。
    然而,有时候我们的项目并没有复杂到需要用上Vuex。

    这时候你可以考虑使用Event Bus。

    Vue实际上在1.几版本的时候就加入了Event Bus,但是好像官方文档中没怎么提到。
    作者应该是在Vue的原型对象上注入了,所以只要创建一个Vue对象就够了。

    1
    2
    // bus.js
    export default new Vue();

    使用$on全局监听(好像这样说不是很正确)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import Bus from '../bus.js';

    export default {
    ready() {
    Bus.$on('loadSuccess', text => {
    this.show = true;
    this.status = 'loadSuccess'
    if (text) {
    this.text = text;
    }
    })
    },
    }

    使用$emit触发事件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ajax({
    url: Config.API_ADDRESS_ADD,
    type: 'post',
    dataType: 'json',
    data: data
    }).then((data)=>{
    Bus.$emit('loadSuccess', '添加成功!');
    }).catch((data)=> {
    })

    使用$once注册一次,触发之后即被销毁。
    使用$off解绑事件。

    就这么简单。Event Bus非常简单好用,但也有存在隐患,需要注意:

      • 保持良好的团队命名规范,避免冲突,因为所有事件代码都保留在各个组件内部,发生冲突很难 debug。
      • 尽量减少不必要的通信,合理使用props传参。
      • 大型项目,应该一开始就选用vuex
  • 相关阅读:
    Conference deadlines
    waiting list
    BDA3 Chapter 1 Probability and inference
    PP: Articial Intelligence—TheRevolution Hasn’t HappenedYet
    兼容ie9文件上传,及现代浏览器实现进度条
    input 打开文件夹事件委托
    前端构建工具gulpjs的使用介绍及技巧
    如何编写兼容各主流邮箱的HTML邮件
    前端通用框架可行性研究报告之弹窗
    切换tab键,不聚焦a标签
  • 原文地址:https://www.cnblogs.com/Tohold/p/8831042.html
Copyright © 2011-2022 走看看