Vue2通过用Object…defineProperty来设置数据的getter和setter,从而实现数据和视图改变的监。对于数组和对象,或者深层数据来说,getter和setter无法检测到它们内部的变化,就会导致视图不更新不渲染。
原理
每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。
受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
vue3已经不会有这个问题
【举个栗子】:
<div
v-for="(workItem, index) in workItemList"
:key="index"
class="work-item"
>
<div class="check-box">
<van-checkbox-group
v-model="workItem.valArr