【发布时间】:2019-10-29 00:13:26
【问题描述】:
当我们尝试直接更改 prop 值时,Vue.js 会显示警告,如下所示:
Vue.component('Games', {
template: `
<div>
<ol>
<li v-for="game in games">{{ game }}</li>
</ol>
<button @click="clear">Clear games</button>
</div>
`,
props: ['games'],
methods: {
clear: function () {
this.games = [];
}
}
});
正在显示的警告是:
避免直接修改 prop,因为每当父组件重新渲染时,该值都会被覆盖。相反,使用基于道具值的数据或计算属性。
我知道为什么会发生这种情况,但令我惊讶的是.push() 不会发生这种情况。如果我更改方法以向数组添加值而不是重写它,则不会出现警告:
methods: {
add: function () {
this.games.push('Whatever');
}
}
为什么没有警告?怎么直接推到 prop 好,重写不行?
【问题讨论】:
-
被推送到的道具是一个数组。压入一个新值后,它仍然是一个数组。我相信 vue 不会对开箱即用的 props 进行深入观察(即,它不关心 inside 数组的内容)。
-
同类型有什么关系?据我所知,Vue.js 甚至有自己的
Array.push包装器,所以它会让事情变得更容易控制。据说在重新渲染的情况下更改道具是错误的。这不是关于类型,而是关于值与在 prop 中传递的值不同。 -
我现在将发布更深入的答案。
标签: javascript vue.js