Vue 3中数组与对象

admin2周前 (05-16)it知识87

一、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知识

相关文章

夏天的台风

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

个人学习计划

学习计划是一个帮助你提高学习效率和使用时间的有效工具。以下是一个可能的学习计划:目标设定。 在开始学习之前,明确你的学习目标和目的地,这有助于你制定实际可行的计划。分解任务。 将大...

如何写文章

过程,需要一定的技巧和准备。以下是一些写文章的步骤和技巧:确定文章的主题和目的:在开始写作之前,您需要明确文章的主题和目的。这有助于您确定文章的重点和方向。研究和收集信息:在开始写作之前,进行一些研究...

双因素理论

双因素理论是美国心理学家弗雷德里克·赫兹伯格(Frederick·Herzberg)于20世纪50年代后期提出的,这一理论的研究重点是组织中的人与工作的关系问题。双因素理论包括保健因素和激励因素。保健...

故事分解结构

故事分解结构是一种用于分析、设计和编写故事的方法,它可以将故事分解为不同的层次,从而更好地理解故事的内在逻辑和结构。下面是故事分解结构的详细解释:节拍(beat):是故事的最小单位,包含动作和反应两个...

沟通的模型

7C模型:这是一种在商业沟通中常见的模型,旨在确保信息在传递过程中清晰、简明、准确、一致、可信、可理解和有说服力。沟通的五个W和一个H:何人(Who)何事(What)何地(Where)何时(When)...

发表评论

访客

看不清,换一张

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