zoukankan      html  css  js  c++  java
  • 兄弟组件之间如何通信

    在工作中有些情景。兄弟之间的通信,可能用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对象了。

  • 相关阅读:
    iOS 面试题搜集
    iOS 常用第三方类库、完整APP示例
    iOS 键盘遮挡输入 解决办法
    iOS UIColor RGB HEX
    iOS APP性能优化
    iOS Swift 数组 交换元素的两种方法
    iOS CoreData primitive accessor
    iOS Start developing ios apps (OC) pdf
    iOS 传值方式
    iOS IB_DESIGNABLE IBInspectable @IBDesignable @IBInspectable 加速UI开发
  • 原文地址:https://www.cnblogs.com/daiwenru/p/8579098.html
Copyright © 2011-2022 走看看