我有两个组件:组件A
和组件B
。 A.vue
就像:
export default {
name: 'A',
data () {
var: true
}
}
B.vue
是:
import A from './A'
export default {
name: 'B',
components: {
A
}
}
我想在组件var
中使用组件A
的变量B
的动态值。因此我设置了一个观察者:
import A from './A'
export default {
name: 'B',
watch: {
A.data().var: func () {
console.log('Value of var changed in A.')
}
}
components: {
A
}
}
但是,这种方法不起作用。组件A
和B
没有子父关系,因此我不能使用道具。我怎么能这样做?
答案 0 :(得分:1)
我会考虑使用简单的state management (Vue docs)来解决您的问题。
var store = {
debug: false,
state: {
myVar: false
},
setMyVarAction (value) {
this.state.myVar = value
}
}
将商店分配给您的组件A
和B
:
data () {
return {
sharedStore: store.state
}
}
jsfriddle有一个工作示例。
答案 1 :(得分:1)
假设 A
和B
的个实例都存在于同一个根实例中,您可以将该根用作两个组件之间通信的事件中心。
第1步| 在需要时调用handleAVarChange
的根模板:
const rootTemplate = `
<div class="root">
<A @var-change="handleAVarChange"></A>
<B v-bind:AVar="AVar"></B>
</div>
`;
第2步| 实施rootTemplate
的Vue根脚本:
const root = new Vue({
template: rootTemplate,
data() {
return { AVar: null };
},
methods: {
handleAVarChange(value) {
this.AVar = value;
}
}
});
template
:包含A
和B
data
会返回一个包含属性AVar
的对象,我们将使用该对象在A
上存储源变量。methods.handleAVarChange
可用作root.template
中的事件处理程序。 第3步| $emit
名为'var-change'
的活动,其中包含A
的新值:
export default {
name: 'A',
data () {
return {
Var: true,
}
},
methods: {
onSomeEvent(varValue) {
this.$emit('var-change', varValue);
// or maybe...
this.$emit('var-change', this.Var);
},
},
}
第4步| 确保AVar
中的prop
设置为B
:
export default {
name: 'B',
props: ['AVar'],
// ...
}