今天在使用el-date-picker时遇到一个奇怪的问题,使用日期组件el-date-picker,新增时一切正常。
但是获取数据后,日期也能正常回填,但是我编辑改变日期后,却还是之前的数据,怎么改都不变。
开始以为是keep-alive组件缓存造成的,将keep-alive缓存关掉发现还是一样。
后面突然想到,是不是数据响应式丢失造成的。
开始,我在获取数据后,是这么赋值的:
this.baseInfo = res.data
this.baseInfo.activity_time = [activity_start_time, activity_end_time]
this.baseInfo.date_time = [start_time, end_time]
先让this.baseInfo = res.data然后再修改日期组件的值。 发现无法回显了。
后面改成如下形式:
res.data.date_time = [start_time, end_time];
res.data.activity_time = [activity_start_time, activity_end_time];
this.baseInfo = res.data
就调换了下顺序,就好了。
在 Vue 中,响应式系统是基于对象属性的 getter 和 setter 实现的。当你把一个普通的 JavaScript 对象赋值给 Vue 实例的数据属性时,Vue 会遍历这个对象的所有属性,并使用 Object.defineProperty 把它们转化为 getter/setter,使它们变得响应式。
当你执行 this.baseInfo = res.data
时,Vue 会尝试把 res.data
对象转化为响应式对象。如果 res.data
已经有 activity_time
和 date_time
属性,那么这些属性也会被转化为响应式。
第一种情况:
this.baseInfo
被赋值为res.data
的一个响应式副本。- 接着修改了
this.baseInfo.activity_time
和this.baseInfo.date_time
。
如果 el-date-picker
组件在之前已经通过 v-model
或其他方式绑定了 baseInfo.activity_time
或 baseInfo.date_time
,并且组件在赋值操作之前已经渲染或初始化,那么可能存在以下情况:
- 组件可能在内部缓存了初始值,或者有一些状态没有随着外部数据的改变而更新。
- 如果组件的初始化依赖于这些属性的初始值,并且这个初始化过程在数据更新之前已经完成,那么组件可能不会正确地响应后续的数据变化。
第二种情况:
- 先修改了原始对象
res.data
的属性。 - 然后把修改后的
res.data
赋值给this.baseInfo
。
在这种情况下:
- 当
this.baseInfo
被赋值为res.data
时,activity_time
和date_time
属性已经包含了最新的值。 - Vue 会把这些最新的值转化为响应式,并且任何依赖于这些值的组件都会立即得到更新。
- 因为
el-date-picker
组件是在这些属性已经被设置之后才开始渲染或初始化的(假设赋值操作是在组件渲染之前完成的),所以它会使用这些最新的值进行初始化,并且后续的数据变化也会被正确地响应。
文章评论