已找到答案 :
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值为:3
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>proptest</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1>{{hello}}</h1>
<button @click="ageChange">改变age</button>
<age ref="age" :age="age"></age>
</div>
</body>
<script>
Vue.component('age', {
props: ['age'],
data() {
return {
ageChangeTime: 0
}
},
methods: {
printChildAge() {
this.ageChangeTime = new Date().getTime()
console.log('子组件中的age值为:' + this.age)
}
},
watch: {
age(val, oldVal) {
console.log('父组件改变age值后:' + (new Date().getTime() - this.ageChangeTime) + '毫秒,子组件才监控到变化,变化前age:'
+ oldVal + ',变化后age:' + val + ',此时子组件中的age值为:' + this.age)
}
},
template: '<div>年龄:{{age}}</div>'
})
const app = new Vue({
el: '#app',
data() {
return {
age: 1,
hello: 'hello world'
}
},
methods: {
ageChange() {
this.age++
console.log('父组件中的age值为:' + this.age)
//调用子组件,输出子组件中的age值
this.$refs.age.printChildAge()
}
}
})
</script>
</html>
只说说结果为什么是这样子
请考虑如下同步代码,那下面的代码会发生什么?
watch
3遍吗?不,通常来说,用户并不更新中间变了什么值,值关心一次marcotask
最后的值变成了什么样。所以
vue
是怎么做的呢,放microtask
里。scheduler.js#L176当然如果你需要同步更新子组件也不是不可以,加上
Vue.config.async = false
,但这个特性很快也会被移除。Vue-config-async-移除