Vue.js的平行组件之间如何互相通信?

目前在项目中有这么两个平行的vue.js组件, 都挂载在$el:document.body下:halldetail
现在的情况是, detail中的某个值改变了, 需要在hall中的某个值也作出相应的改变。 本来是想做父子组件的, 但项目框架如此, 改还要牵扯到很多, 暂缓了。
我们知道vue.js中组件树的通信是比较方便的: 子组件可以通过v-bindprop来从父组件继承值并双向绑定, 而子组件也可以通过$dispatch方法来向父组件发送信息
那么这种平行的子组件之间, 有没有什么好的通信方法呢?
现在的临时解决方案就是:收到ajax的返回信息之后, 在回调函数中这样写:

this.$parent.$children[0].$data.somedata = somavalue

但这样的写法让我很不安, 且不说那个强耦合$children[0], 实现也不甚优雅
有没有什么好的办法呢?求解!
更加令人蛋伤的是项目用的是0.12版本+browserify进行组件打包, 1.0的高级特性不敢乱用……

阅读 36.5k
13 个回答

如果通过props来解决的话,可以在两个平行子组件的共同父组件中设定一个data用于储存你要传递的数据,然后两个子组件都通过props连接父组件的这个data,实现一个三方同步。

如果通过$dispatch和$broadcast来解决的话,可以dispatch到根组件,然后在broadcast到子组件。

还可以通过vuex来解决,处处数据同步,处处可取。

有很多种方法:
1,父组件将一个数据props赋给两个子组件,并是sync的,子组件watch数据回调。

2.event bus
vue2.0里面的event bus(其实就是个发布订阅模式):

var bus = new Vue()

// in component A's method
bus.$emit('id-selected', 1)

// in component B's created hook
bus.$on('id-selected', function (id) {
  // ...
})

3.$dispatch $broadcast
建议不用,2.0要废除

4.vuex

应该可以通过Vuex解决。

新手上路,请多包涵

可以使用vuex,把数据存储在store中,两个组件分别获取store中的数据,数据是实时刷新的。

事实上,两个平行的组件之间不应该直接通信,否则将会破坏组件的独立性。

举例来说,当用下拉选择框( select 标签)实现省市区级联的效果时,我们绝不会期待 select 标签直接将数据传递给另外一个 select 标签,而是通过事件的方式,由另外一个角色进行调度。

使用vuex吧,并且vue2里$dispatch和$broadcast也弃用了。

看这个问题的回答

我在这篇使用Vue.js和Vuex实现购物车场景文章解释了。两个组件的之间的沟通渠道相对麻烦,vuex可以解决这一问题。

SLIDER 這篇簡報的彙整了一些情境與方式當然也包含 vuex 提供參考

把事件冒到两个节点的公共祖先上传递信息

也可以用ref

可以再子组件发送dispatch ,父组件监听到后,分发到兄弟组件中

要是我,就$parent.$broadcast。本身是局部的属性,放在vuex太累了。就用最简单的办法,实现通信就好。

vuex完美解决

推荐问题
宣传栏