reactive
- 只能定义对象
- 访问时像普通的对象一样直接.属性
- 不能整个替换,即如下代码会导致reactive失去响应式,因为reactive是让对象本身具有相应式,当替换成新的对象,就不会被vue监测到变化了
- 具有深层响应式,即它该对象内部的子子孙孙的变换都会被监测到,可以用
shallowReactive()放弃深层响应式。
const obj = reactive({name:'张三',age: 9})
obj = {name: '李四',age: 10} // 直接替换,将导致obj丢失响应式
需要更新整个对象,需要借助Object.assign(),reactive就天然有Object.assign的局限性,即只会添加和替换,不会删除属性。
比如 不同的入参,后端返回的数据data的属性数量不同。这时 直接 Object.assign(obj,data),就会产生bug。上次接口返回的data 有a属性,而本次没有a属性。a属性仍然存在obj中。。。
Object.assign(obj,{name: '李四',age: 10})
ref
- 既可以定义基本类型,又可以定义对象
- 访问对象时,要.value
- obj.value 可以直接替换成新对象。因为.value 具有响应式。相当于vue会劫持.value的getter,setter方法,而实现响应式
- 具有深层响应式,也可以通过
shallow ref放弃深层响应性