Vue 3中数组与对象

admin4个月前 (05-16)it知识277

一、Vue 3响应式原理与基础操作

1. 响应式系统实现

Vue 3使用Proxy替代了Vue 2中的Object.defineProperty来实现响应式系统,带来了以下优势:

  • 全面性‌:可以监听对象的新增属性和删除属性

  • 高效性‌:无需递归遍历整个对象树,只有在访问某个属性时才会触发代理

  • 支持数组操作‌:可以直接监听数组的变化,例如push、splice等方法

核心API包括:

  • reactive‌:用于创建响应式对象,适用于复杂数据结构

  • ref‌:用于创建包含value属性的响应式对象,适用于基本数据类型

  • toRefs‌:将响应式对象转换为普通对象的响应式引用

2. 数组操作最佳实践

Vue 3对数组的原生变异方法进行了包裹,使得这些操作能够触发视图更新:

const arr = reactive([1, 2, 3]);
arr.push(4);  // 正确方式

应避免的操作:

直接通过索引修改数组元素:arr[0] = 'newValue' (不会触发更新)

直接修改数组长度:arr.length = newLength (不会触发更新)

二、对象操作与动态属性管理

1. 对象属性操作

在Vue 3中,可以直接修改响应式对象的属性:

const form = reactive({ file: "", fileArr: [] });
form.file = "newFile.txt";  // 正确方式


批量更新对象属性的方法:

// 使用Object.assign
Object.assign(form, { file: "newFile.txt", fileArr: ["file1.txt"] });
// 使用展开运算符
form = { ...form, ...{ file: "newFile.txt" } }:ml-citation{ref="13" data="citationList"}

2. 动态添加属性

Vue 3中动态添加属性的正确方式:

const maskingConfig = reactive({} as any);
maskingConfig.newProperty = "value";  // 直接添加属性:ml-citation{ref="27" data="citationList"}
// 或者使用Reflect.set
Reflect.set(val, 'middle', middle):ml-citation{ref="26" data="citationList"}

三、深拷贝与响应式数据

1. 深拷贝方法

在Vue 3中实现深拷贝的几种方式:

方法优点缺点适用场景
JSON.parse(JSON.stringify())简单易用无法拷贝函数、循环引用简单数据结构
Lodash的_.cloneDeep功能强大需要引入外部库复杂数据结构
递归函数可定制性强需要自行实现特殊需求场景

2. 保持响应式的深拷贝

如果需要保持响应式特性,可以使用toRefs:

const original = reactive({ count: 0 });
const copy = toRefs(original);  // 保持响应式:ml-citation{ref="20" data="citationList"}

四、性能优化技巧

1. 数组性能优化

  • 对于大型数组,考虑使用shallowRefmarkRaw来避免不必要的响应式转换

  • 避免在计算属性中修改状态或产生副作用

  • 使用v-for时始终提供唯一的key

2. 对象性能优化

  • 仅将需要响应式更新的数据标记为响应式

  • 使用computed属性基于其依赖的响应式数据进行缓存

  • 优化深度监听,只监听必要的属性变化


五、常见问题与解决方案

1. 响应式失效场景

  • 直接整体替换reactive对象‌:obj = {a:2} (失去响应式)

    • 解决:使用Object.assign(obj, {a:2})

  • 数组直接赋新数组引用‌:arr = [4,5,6] (失效)

    • 解决:arr.splice(0, arr.length,4,5,6)

  • 深层嵌套对象修改不触发更新

    • 解决:确保使用reactive创建嵌套对象,或改用watchEffect自动追踪依赖

2. 嵌套对象响应式问题

Vue 3的Proxy在处理深层嵌套对象时可能存在缺陷:

const proxyVal = reactive({ 
  info: { 
    age: 18,
    deep: { desc: '...' } 
  } 
});
// 直接访问proxyVal.info.age可能不会触发深层代理:ml-citation{ref="47" data="citationList"}

解决方案:

直接访问reactive定义的变量,而不是使用解构赋值

使用toRefs方法将响应式对象转化为普通对象的响应式属性

在解构赋值时使用拷贝来避免数据丢失


标签: 分享IT知识

相关文章

关于夏天

在一个炎热的午后,阳光穿过树叶的缝隙,洒在公园的草地上。空气中弥漫着夏日的气息,那是炎热中夹杂着淡淡的花香,还有草地的清新味道。在这个充满活力的季节,夏天以其独特的方式展示着它的魅力。夏天是一个充满色...

夏天的台风

夏天,是一个充满活力和生命力的季节,但同时也伴随着台风的出现。每年的这个时期,台风如同一股强大的自然力量,给人们的生命和财产带来了一定的威胁。在台风的肆虐中,可以看到大自然的威力与无情。台风带来的强风...

拖延症重度患者怎样自救

对于拖延症的重度患者,自救的关键在于以下几点:识别并克服拖延的借口。拖延常常因为我们害怕、不确定、不想不舒服而找到各种借口。我们必须识破这些借口,并对自己说:“如果我拖延,后果将不堪设想。”制定清晰的...

敏捷开发

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可...

如何学习 javascript

学习JavaScript需要以下步骤:基础语法:学习JavaScript的基础语法,包括变量、数据类型、函数、循环、条件语句等。DOM 操作:学习如何操作 DOM,例如获取和修改元素、添加和删除事件处...

如何高效学习

努力和技巧的能力。以下是一些可以帮助你高效学习的方法:制定学习计划:制定一个清晰的学习计划,包括学习内容和时间表,有助于你更好地组织自己的学习并提高学习效率。创造良好的学习环境:在学习时,尽可能避免干...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。