我已经使用 Vue 一段时间了,我的经验一直是,如果更新其底层反应性数据,方法将重新计算。我在 SO 上遇到了相互矛盾的信息:
我搜索了文档,但没有看到任何非常清楚的内容。
如果他们不是反应性的,那么为什么这个例子有效?
<ul>
<li v-for="animal in animals" :key="animal.id">
<span v-if="isAwesome(animal)">{{ animal.name }}</span>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
export default {
data() {
return {
awesomeAnimalIds: [],
animals: [
{ id: 1, name: 'dog' },
{ id: 5, name: 'cat' },
{ id: 9, name: 'fish' },
],
};
},
created() {
setTimeout(() => {
this.awesomeAnimalIds.push(5);
}, 1000);
setTimeout(() => {
this.awesomeAnimalIds.push(9);
}, 2000);
},
methods: {
isAwesome(animal) {
return this.awesomeAnimalIds.includes(animal.id);
},
},
};
Run Code Online (Sandbox Code Playgroud)
我真的很想有一个明确的、令人满意的答案,这个社区可以参考。
根据文档中如何跟踪更改,这是发生了什么:
为组件实例创建了一个特殊的观察器,以确定何时需要重新渲染。
Vue 将 的所有属性转换data
为 getter 和 setter。
get animals() {
// Add dependency: potentially trigger a re-render if animals updates
...
}
set animals() {
// Notify the watcher that animals has been updated
...
}
get awesomeAnimalIds() {
// Add dependency: potentially trigger a re-render if awesomeAnimalIds updates
...
}
set awesomeAnimalIds() {
// Notify the watcher that awesomeAnimalIds has been updated
...
}
Run Code Online (Sandbox Code Playgroud)
isAwesome
从模板调用。isAwesome
,awesomeAnimalIds
调用了 getter for 。awesomeAnimalIds
字段的依赖data
。awesomeAnimalIds
被更新,它调用awesomeAnimalIds
设置器。data
收到通知的字段,因此会触发重新渲染。从这个和上面的例子,我们可以得出以下结论:
从模板进行的方法调用建立
data
对方法调用堆栈中使用的字段子集的反应式依赖。如果底层字段被更新,它将触发组件的重新渲染。
有一种常见的误解,认为从模板调用方法时“仅调用一次”或“即发即弃”。显然情况并非总是如此,因为方法可以建立反应式依赖关系。
那么我们什么时候应该使用计算属性而不是方法呢?
请参阅有关Computed Caching vs Methods的指南部分。这是我的看法:
fetch
从他们那里打电话。 归档时间: |
|
查看次数: |
2735 次 |
最近记录: |