Любое значение, переданное как prop
, прослушивается компонентом, который его получает. Таким образом, если родитель изменяет это значение, дочерняя версия будет иметь свою собственную измененную версию, перезаписанную новым значением родителя. Это может привести к неожиданному поведению. Лучше иметь копию значения в любое время, когда оно изменяется. Например, вы можете использовать свойство «watched»:
{
props: [ "userAge" ],
data: function() {
return {
myUserAgeCopy: null
};
},
watch: {
userAge: function() {
this.myUserAgeCopy = this.userAge;
}
}
}
Затем все дальнейшие операции выполняются на myUserAgeCopy
.
Обратите внимание, что приведенное выше по-прежнему приводит к той же проблеме перезаписи данных, что и при прямом изменении prop
. Важно то, что теперь эта перезапись сделана явной и предсказуемой благодаря тому, как вы написали код.
В общем, если вам нужно синхронизировать родитель и потомок, вы всегда должны $emit
вносить изменения на уровне ребенка, разрешать родителю принимать эти изменения, а затем получать $emit
изменения в потомке через оригинал prop
:
child: {
props: [ "userAge" ],
data: function() {
return {
myUserAgeCopy: null
};
},
watch: {
userAge: function() {
this.myUserAgeCopy = this.userAge;
},
myUserAgeCopy: function() {
this.$emit('user_age_changed', this.myUserAgeCopy);
}
}
}
parent: {
data: function() {
return {
userAge: 30
};
},
methods: {
handleUserAgeChange: function(userAge) {
this.userAge = userAge;
}
}
}
<child :userAge="userAge" v-on:user_age_changed="handleUserAgeChange"/>