vue3 shallowRef和shallowReactive

1.shallowRef:浅层响应式引用
shallowRef 是一个创建响应式对象的函数,与 ref 不同之处在于,shallowRef 只会在对象的第一层进行响应式处理。这意味着当对象的深层属性发生变化时,不会触发视图更新,从而提高了性能。
让我们看一个例子:

import { shallowRef, watchEffect } from 'vue';
 
const user = shallowRef({
  name: 'John',
  address: {
    city: 'New York',
    zip: '10001'
  }
});
watchEffect(() => {
  console.log('User changed:', user.value);
});
 
// 修改深层属性,不会触发视图更新
user.value.address.city = 'San Francisco';
 

在上面的例子中,watchEffect 只会在 name 属性发生变化时触发,而不会在 address 的变化时触发。这有助于避免不必要的性能开销,这对于一些场景非常有用,例如在处理大型数据集合时,可以提高性能并减少不必要的更新。

2.shallowReactive:浅层响应式对象
与 shallowRef 类似,shallowReactive 用于创建一个浅层响应式的对象。这意味着只有对象的第一层属性会被响应化,这对于避免在深层次对象中进行递归响应式转换非常有用。

import { shallowReactive, watchEffect } from 'vue';
 
const user = shallowReactive({
  name: 'John',
  address: {
    city: 'New York',
    zip: '10001'
  }
});
 
watchEffect(() => {
  console.log('User changed:', user);
});
 
// 修改深层属性,不会触发视图更新
user.address.city = 'San Francisco';

在上述例子中,watchEffect 只在 name 属性变化时触发,而 address 属性的变化不会引起更新。

使用场景

  1. 性能优化
    在处理大型数据集或嵌套对象时,使用 shallowRef 和 shallowReactive 可以提高性能,避免不必要的响应式转换和更新。

  2. 避免无限循环
    当你在数据模型中存在相互引用的情况时,使用 shallowRef 和 shallowReactive 可以帮助你避免创建无限循环的响应式数据。

  3. 更精确的控制
    如果你只关心对象的第一层属性,而不希望触发深层次的更新,那么 shallowRef 和 shallowReactive 提供了更精确的控制。

结论
使用 shallowRef 和 shallowReactive 的性能优势在于避免了深层对象的递归侦听,从而减少了触发响应式系统的次数。这对于大型项目和数据结构来说是非常有用的。

通过了解它们的使用方式和性能优势,我们可以更好地利用 Vue3 的响应式系统。始终记住,在使用这些特性时,要根据具体情况权衡性能和开发的便利性,确保你的代码保持清晰、易读和可维护。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容