为什么vue2的watch有deep属性而computed没有呢?

为什么vue2的watch有deep属性而computed没有呢?
最新回答
顾执

2021-03-06 01:52:47

Vue.js框架在处理数据监听时提供了两种方式:watch和computed。两者在数据变化时触发响应的方式存在本质差异,这导致了watch具备`deep`属性而computed则没有。

computed依赖的确定性来源于其计算属性的特性。每次执行计算时,computed会收集所有需要的依赖。因此,它的依赖列表是固定的、已知的。这意味着在使用computed时,开发者可以确信特定的依赖会在计算结果生成时被更新,从而触发相应的逻辑执行。

相比之下,watch器在处理依赖时遵循更为灵活的原则。watch器允许开发者指定依赖的范围,既可以是具体的数组元素或对象属性,也可以是整个数组或对象。这种灵活性赋予了watch器更广泛的应用场景。

具体而言,有两类主要的watch依赖需求:第一种,仅当整个数组或对象被替换时执行监听逻辑。第二种,即使数组或对象内部元素发生了变化,也应触发监听逻辑。为了适应这两种需求,watch器引入了`deep`属性。通过设置`deep`为`true`,开发者可以确保即使嵌套对象或数组内部的值发生变化,也能触发相应的监听逻辑。

综上所述,watch与computed在依赖管理上的差异是基于它们各自的设计目标。computed旨在提供确定、高效的计算结果,而watch则侧重于灵活的数据监听机制。因此,watch的`deep`属性提供了额外的控制手段,以满足更为复杂的数据变化检测需求。这一设计决策体现了Vue框架在提供强大而灵活的响应式系统时,对不同场景需求的细致考量。