我知道,Vuejs> = 2.0中组件之间的通信是由三个概念完成的
我也知道中央状态模式及其周围的所有东西。但有时通常能够告诉孩子组件"做某事,改变你的内部状态"。
以下是一些情景:
问题是:如何实现"基于事件"父母中组件之间的通信 - >孩子的方向。我觉得这是一种常见的情况。
我做了一个例子jsbin。但是,我不确定它是否违反了vue js的一些基本思想。
https://jsbin.com/kakucuf/edit?html,js,output
const Foo = {
name: 'Foo',
template: '#a-template',
props: {
name: {
required: true,
type: String
},
},
data() {
return {
counter: 0
}
},
mounted() {
this.$on('increment', this.increment);
},
methods: {
increment() {
this.counter += 1;
}
}
}
new Vue({
el: "#app",
components: {
foo: Foo,
},
methods: {
incrementAll() {
this.$children.forEach((child) => child.$emit('increment'));
}
}
});
答案 0 :(得分:1)
也许computed properties and watchers可以帮到你。
在父组件中,您可以将计算属性用作子组件的道具。一旦计算属性发生变化,您的子组件就会因Vue.js反应功能而更新。
并且,在您的子组件中,使用观察者来控制此组件上下文中的更改。
从您的方案开始:
collapse
道具,"听" (或实际上"观察")通过子组件中的观察器更改其值,如果新值为true
<,则观察器功能将执行每个子组件内的折叠工作/ LI>
increment
道具,并通过子组件中的观察者观察其值的变化例如,对于第二种情况,请使用父组件中的increment
道具,并在子组件中观察它:
watch: {
increment: function (newVal) {
if (newVal === true) {
this.counter++
}
}
}
在您的父组件中,将this.increment
设置为true
会触发子组件中的观察者。如果您需要增加更多内容,请注意,在重新分配null
之前,您必须将其重新设置为true
之类的其他值。
那是一种黑客攻击,应该代表你开始考虑像Vuex这样的状态管理解决方案的时候!