Vue3——定义响应式数据
一、ref和reactive
ref:可定义基本类型数据和对象类型数据
reactive:只能定义对象类型数据
区别:
·reactive重新分配一个新对象,会失去响应式(可以用Object.assign去整体替换)
使用原则:
1.若需要一个基本类型的响应式数据,必须使用ref
2.若需要一个响应式对象,层级不深,ref/reactive都可以
3.若需要一个响应式对象,且层级比较深,建议使用reactive
// ref
// 基本类型
let sum = ref(0);
// 对象类型
let car = ref({
brand: '奔驰',
price: 100,
})
// reactive 只能声明对象类型
let car = reactive({
brand: '奔驰',
price: 100,
})
二、
let person = reactive({
name: '张三',
age: 18,
})
let car = ref({
brand: '奔驰',
price: 100,
})
let {brand, price} = toRefs(car.value);
// 用toRefs相当于把reactive/ref定义的person里面的每一组key/value都拿出来形成一个新的ref对象
let {name, age} = toRefs(person); // 现在相当于name和age都是ref响应式数据
// toRef相当于把person里面的数据一个一个取出来,也是生成ref响应式数据
let nl = toRef(person, 'age');
三、其他API:shallowRef和shallowReactive(创建浅层)
shallowRef:
作用:创建一个响应式数据,但只对顶层属性进行响应式处理(针对比较大的数据,且只关注整体更改时用shallowRef效率会更高)
用法:
let myVar = shallowRef(initialValue);
特点:只跟踪引用值的变化,不关心值内部的属性变化
shallowReactive:
作用:创建一个浅层响应式对象,只会使对象的最顶层属性变成响应式的,对象内部的嵌套属性则不会变成响应式的
用法:
const myObj = shallowReactive({...})
特点:对象的顶层属性是响应式的,但嵌套对象的属性不是
总结:通过使用shallowRef()和shallowReactive()来绕开深度响应。浅层式API创建的状态只在其顶层是响应式的,对所有深层的对象不会做任何处理,避免了对每一个内部属性做响应式所带来的性能消耗,这让属性的访问变得更快,可以提升性能。

浙公网安备 33010602011771号