如果数据是由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()。