子组件A通过点击按钮事件传值给父组件,然后再把值从父组件传给子组件B,请问为什么只有第一次点击按钮的时候子组件B收到值了,以后多次点击按钮事件都不管用了。刷新的话还是只有第一次可以接收到值。
代码如下:
子组件A按钮点击传值事件:
goIndex(){
this.$emit('gogo','a');
}
父组件接收代码:
HTML:
<componentsA @gogo = "button" >子组件A</componentsA>
<componentsB :child-tab = "isAddedTab" >子组件B</componentsB>
JS:
export default {
data () {
return {
isAddedTab:''
}
},
components: {
moneyDetails,
settings
},
methods: {
button(e){
console.log(e);
this.isAddedTab = e;
},
}
}
子组件B接收值:
props: ['childTab'],
watch: {
childTab(v){
console.log(v);//这个v只有第一次点击子组件A按钮可以打印出来,再次点击按钮就打印不出来了
}
},
你$emit('gogo','a') 是个固定值a, vue是响应式的,如果isAddedTab值没变,不会再传值给B组件
相当于B组件一开始获得父组件传过来的isAddedTab值是空,因为父组件默认值是空,然后A组件按钮点击,事件回调给父组件,改变isAddedTab值为a,这时候因为isAddedTab改变所以传递给子组件B,B里面watch得到值a,然后你A组件按钮二次点击,事件会触发,但是因为isAddedTab值本来就是a,赋值再次赋为a,不会重复传递值给B组件,因为值根本没有发生变化,vue在这边是做过优化的,不会重复传递相同值
你如果需要A组件每次点击,B组件都要触发某些操作,那就A组件事件触发给父组件,父组件直接调用子组件B的某个方法就行,不用prop传值
如果是A组件点击返回一个值给B组件,你现在这么写没问题,当值变化的时候B组件才会获得通知,这个没问题,只是你demo里面每次传的值都一样,所以只打印1次