reative响应式重新赋值数据丢失问题

579 阅读1分钟

如果数据是由reactive代理,即

const  list = reactive({})

在接收到接口数据后,注意在数据赋值时不能直接赋值,比如list=data,否则会造成响应式丢失。

这是由于reactive声明的响应式对象被list代理, 操作代理对象需要有代理对象的前缀,直接覆盖会丢失响应式。

解决方案

一、reactive定义一个对象,对象里的每个属性都具有响应式

const  list = reactive({
	arr:[]
})
list.arr = data.arr

二、将list声明为ref方式

const list = ref([])
list.value = data

ref 定义数据(包括对象)时,都会变成 RefImpl(Ref 引用对象) 类的实例,无论是修改还是重新赋值都会调用 setter,都会经过 reactive 方法处理为响应式对象。

但是 reactive 定义数据(必须是对象),是直接调用 reactive 方法处理成响应式对象。如果重新赋值,就会丢失原来响应式对象的引用地址,变成一个新的引用地址,这个新的引用地址指向的对象是没有经过 reactive 方法处理的,所以是一个普通对象,而不是响应式对象

 

不推荐使用Object.assign() 处理reactive()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配(赋值)到目标对象。所以无法对例子里新增加的数据newKey清除掉!(这种问题常见于从后端接口获得的数据,有时候有{}值,有时候null)。此时不可用 Object.assign()

严格定义对象的interface类型,确保数据完全在掌握范围内,可用 Object.assign()。