从以下几个方面来回答这个问题:为什么会有延迟
这个问题要从Virtual Dom说起,Vue的使用者只负责处理状态就行了,真正的页面渲染都交给Virtual Dom来做。并不是我们做的每一次状态修改都会立即触发页面Viritual Dom,会等主任务执行完后,相关操作已放在nextTick(使用Promise, MutationObserver, setImmediate, setTimeout等技术实现),这个过程就会产生延迟。如何做到父改了值立即触发子watch
在Vue 1.0 中有一个配置是async,配置方法如下:
Vue.config.async = false
当设置为false的时候。状态变化后不再使用微任务执行,watch会立即在主任务实行。
对于问题中提供的HTML,打印出来的顺序会是:
父组件改变age值后:1595040462300毫秒,子组件才监控到变化,变化前age:1,变化后age:2,此时子组件中的age值为:2
test.html:94 父组件中的age值为:2
test.html:64 子组件中的age值为:2
每当有任何状态变化,立即触发Observable,子组件的watch就会先于父的下一行代码执行。
但是,vue这么做会有很大的性能问题,所以1.0文档上说这个状态只用于调试。2.0文档上已经标明删除了,但是考虑到兼容性,Vue源码上还保留着,并且源码确保了生产环境不使用sync模式。从Vue 2.0 源码上看这个问题
在更新state后会触发watch,执行了queueWatcher, 相关源码如下: