Vue 3中数组与对象

admin2个月前 (05-16)it知识172

一、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年代后期提出的,这一理论的研究重点是组织中的人与工作的关系问题。双因素理论包括保健因素和激励因素。保健...

国庆节快乐

在这个特殊的日子里,让我们共同庆祝中华人民共和国的生日。红旗飘扬在空中,礼炮声回荡在城市中,举国欢庆。我们爱我们的国家,因为它是我们温暖的家园,我们成长的摇篮。国庆节是我国的法定节假日,这是一个金色的...

如何快速建立一个网站

要快速建立一个网站,可以遵循以下步骤:确定网站的目的和需求:在开始建立网站之前,需要明确网站的目的和目标受众,以及网站需要提供哪些内容和服务。这有助于确定网站的设计、功能和内容。选择合适的网站建设平台...

发表评论

访客

看不清,换一张

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