• 兄弟组件之间如何通信


    在工作中有些情景。兄弟之间的通信,可能用vuex 并不方便,所以需要一个中间介质传递一下。

    Vue 实例实现了一个事件分发接口.

    请直接看代码,在初始化web app的时候,给data添加一个 名字为eventhub 的空vue对象

    new Vue({
      el: '#app',
      router,
      render: h => h(App),
      data: {
        eventHub: new Vue()
      }
    })

    好的 这个时候 你就可以一劳永逸了,在任何组件都可以调用事件发射 接受的方法了.

    如何获取到这个空的vue对象 eventhub呢.在组件里面直接调用这个

    某一个组件内调用事件触发

    //通过this.$root.eventHub获取此对象
    //调用$emit 方法
    this.$root.eventHub.$emit('YOUR_EVENT_NAME', yourData)

    另一个组件内调用事件接受,当然在组件销毁时接触绑定,使用$off方法

    this.$root.eventHub.$on('YOUR_EVENT_NAME', (yourData)=>{
        handle(yourData)
    } )
    

    遇到一个问题 ,考虑特定场景:

    跳转路由之前我们调用了$emit方法,这个方法在A组件里面处理数据,但是A组件绑定$on事件之前 $emit事件已经发射,所以这会导致一直接受不到消息,看来这个事件绑定有时效性问题,你可以setTimeout来做一下延时,但是这个特别奇怪,那就把数据存到store然后等A组件加载完了再去取。。。。

    额外方法

    1.在stackoverflow 发现一个更加简洁的方法,因为本质上vue是一个js对象,我们想保存一个全局对象,只需要在Vue的prototype上面增加一个属性即可,本质上所有Vue组件都是继承全局的Vue。只要在初始化Vue对象之前给原生Vue对象prototype增加属性,那样所有的组件(因为都是继承自它的实例)都可以访问到这个属性。相关资料请参考我之前的文章关于函数的构造函数和prototype<四>

    在初始化Web app 之前 加上这样一句:

    Vue.prototype.$eventHub= Vue.prototype.$eventHub ||  new Vue()

    当然我们可以定义其他的全局变量.比如当前app的系统配置文件,名字为sysconfig.json,你可以这样定义

    Vue.prototype.$config =Vue.prototype.$config||require('path/sysconfig.json')

    这样我们在组件内部 就可以直接调用$eventHub 和 $config对象了。 
    比如 在mounted函数里面直接 console.log($config.yourKey)

    2.

    刚才看到了webpack的插件里面有一个definePlugin 它可以帮我们定义全局的常量。

    如何使用,很简单但是更好,我们不用去修改Vue对象:

    new webpack.DefinePlugin({
      CONFIG: require('path/sysconfig.json')
    });

    然后我们也可以在全局内使用CONFIG对象了。

  • 相关阅读:
    关于vue中的语法糖v-model
    Cocos2d-x shader学习1: 灰度shader
    nginx多域名配置
    lua和c的亲密接触
    LeetCode 2. Add Two Numbers 解题报告
    LeetCode 1. Two Sum 解题报告
    【翻译】LPeg编程指南
    Cocos2d-x中的CC_CALLBACK_X详解
    C++ 11 学习3:显示虚函数重载(override)
    C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
  • 原文地址:https://www.cnblogs.com/daiwenru/p/8579098.html
Copyright © 2020-2023  润新知