为了账号安全,请及时绑定邮箱和手机立即绑定

在vue中,为什么父组件的值改变后,过几毫秒子组件才能watch到prop的变化?附代码

在vue中,为什么父组件的值改变后,过几毫秒子组件才能watch到prop的变化?附代码

神不在的星期二 2019-05-08 17:33:05
已找到答案:vue官网-深入响应式原理-异步更新队列https://cn.vuejs.org/v2/guide...复现代码下方代码放进html文件中可直接运行,点击改变age按钮,查看控制台变化子组件接收age,父组件传入age,改变父组件的age,输出子组件的age,此时子组件的age值还未更新我想要的结果是父组件age改变后,调用子组件的printAge方法,输出的age值是父组件改变后的age值,为什么结果不是这样,prop的原理为什么不是这样?prop的原理是怎样的?这块逻辑prop的源码是如何实现的?控制台输出:父组件中的age值为:2子组件中的age值为:1父组件改变age值后:5毫秒,子组件才监控到变化,变化前age:1,变化后age:2,此时子组件中的age值为:2父组件中的age值为:3子组件中的age值为:2父组件改变age值后:1毫秒,子组件才监控到变化,变化前age:2,变化后age:3,此时子组件中的age值为:3proptest{{hello}}改变ageVue.component('age',{props:['age'],data(){return{ageChangeTime:0}},methods:{printChildAge(){this.ageChangeTime=newDate().getTime()console.log('子组件中的age值为:'+this.age)}},watch:{age(val,oldVal){console.log('父组件改变age值后:'+(newDate().getTime()-this.ageChangeTime)+'毫秒,子组件才监控到变化,变化前age:'+oldVal+',变化后age:'+val+',此时子组件中的age值为:'+this.age)}},template:'年龄:{{age}}'})constapp=newVue({el:'#app',data(){return{age:1,hello:'helloworld'}},methods:{ageChange(){this.age++console.log('父组件中的age值为:'+this.age)//调用子组件,输出子组件中的age值this.$refs.age.printChildAge()}}})
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

只说说结果为什么是这样子
请考虑如下同步代码,那下面的代码会发生什么?watch3遍吗?不,通常来说,用户并不更新中间变了什么值,值关心一次marcotask最后的值变成了什么样。
this.age++
this.age++
this.age++
所以vue是怎么做的呢,放microtask里。scheduler.js#L176当然如果你需要同步更新子组件也不是不可以,加上Vue.config.async=false,但这个特性很快也会被移除。Vue-config-async-移除
                            
查看完整回答
反对 回复 2019-05-08
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我理解着应该是子组件的age和父组件的age应该是同一个值,父组件值改变了,子组件瞬间改变
那你理解错了,如果按你所说的父子组件的age指向同一个值的话,vue的子组件也不需要使用$emit()事件来跟父组件通讯了。至于vue为什么要这么做,好像教程里也有写。
单向数据流所有的prop都使得其父子prop之间形成了一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。额外的,每次父级组件发生更新时,子组件中所有的prop都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变prop。如果你这样做了,Vue会在浏览器的控制台中发出警告。
                            
查看完整回答
反对 回复 2019-05-08
  • 2 回答
  • 0 关注
  • 516 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信