JavaScript 语言 如何使用Vue 3 reactive vs readonly vs shallowReactive对比

JavaScript阿木 发布于 21 天前 5 次阅读


摘要:在 Vue 3 中,响应式系统是框架的核心之一。本文将深入探讨 Vue 3 中三种响应式API:reactive、readonly 和 shallowReactive 的使用场景、区别以及在实际开发中的应用。

一、

Vue 3 的响应式系统是基于 Proxy 实现的,相较于 Vue 2 的 Object.defineProperty,Proxy 提供了更强大的功能,如拦截对象的任意操作、支持数组等。在 Vue 3 中,reactive、readonly 和 shallowReactive 是三种常用的响应式API,它们在功能上有所不同,适用于不同的场景。

二、reactive

reactive 是 Vue 3 中用于创建响应式对象的函数。它接收一个普通对象作为参数,返回一个响应式代理对象。当代理对象的属性被修改时,视图会自动更新。

javascript

import { reactive } from 'vue';

const state = reactive({


count: 0


});

console.log(state.count); // 0


state.count = 1;


console.log(state.count); // 1


在上面的例子中,我们创建了一个名为 `state` 的响应式对象,其 `count` 属性被修改后,视图会自动更新。

三、readonly

readonly 是 Vue 3 中用于创建只读响应式对象的函数。它接收一个响应式对象作为参数,返回一个只读代理对象。只读代理对象不允许修改其属性,如果尝试修改,将会抛出错误。

javascript

import { reactive, readonly } from 'vue';

const state = reactive({


count: 0


});

const readonlyState = readonly(state);

console.log(readonlyState.count); // 0


readonlyState.count = 1; // 抛出错误


在上面的例子中,我们创建了一个只读的响应式对象 `readonlyState`,尝试修改其属性将会抛出错误。

四、shallowReactive

shallowReactive 是 Vue 3 中用于创建浅层响应式对象的函数。它接收一个普通对象作为参数,返回一个响应式代理对象。与 reactive 相比,shallowReactive 只对对象的最外层属性进行代理,不会递归代理对象内部的所有属性。

javascript

import { shallowReactive } from 'vue';

const state = shallowReactive({


count: 0,


info: {


name: 'Vue'


}


});

console.log(state.count); // 0


state.count = 1;


console.log(state.count); // 1

console.log(state.info); // { name: 'Vue' }


state.info.name = 'React';


console.log(state.info.name); // React


在上面的例子中,我们创建了一个浅层响应式对象 `state`,修改其 `count` 属性会触发视图更新,但修改其内部对象 `info` 的属性不会触发视图更新。

五、总结

1. reactive:用于创建响应式对象,适用于对象内部属性需要响应式的情况。

2. readonly:用于创建只读响应式对象,适用于需要保护对象不被修改的场景。

3. shallowReactive:用于创建浅层响应式对象,适用于对象内部属性不需要响应式的情况。

在实际开发中,根据具体需求选择合适的响应式API,可以提高代码的效率和可维护性。

六、应用场景

1. 使用 reactive:在组件的 data 函数中,创建响应式对象,用于存储组件的状态。

2. 使用 readonly:在组件的 computed 属性中,创建只读响应式对象,用于计算依赖数据。

3. 使用 shallowReactive:在处理嵌套对象时,如果只关心最外层属性的变化,可以使用 shallowReactive。

通过本文的对比分析,相信大家对 Vue 3 中的 reactive、readonly 和 shallowReactive 有了一定的了解。在实际开发中,灵活运用这些响应式API,可以更好地管理组件的状态,提高代码的可读性和可维护性。