vue 对象、数组增删改,对比vue2和vue3 —— 最新总结2025

一、对象操作对比

1. Vue 2 的对象操作

  • 新增属性 :无法直接通过 obj.newKey = 'value' 添加响应式属性,需使用 Vue.set 或 this.$set。
javascript 复制代码
this.$set(this.obj, 'newKey', 'value'); // 触发响应式更新
  • 删除属性 :无法直接通过 delete obj.key 删除响应式属性,需使用 Vue.delete 或 this.$delete。
javascript 复制代码
this.$delete(this.obj, 'key'); // 触发响应式更新
  • 修改属性:直接修改属性值可触发响应式更新。
javascript 复制代码
this.obj.key = 'newValue'; // 触发响应式更新

2. Vue 3 的对象操作

新增属性 :直接通过 obj.newKey = 'value' 添加属性即可触发响应式更新,无需手动调用 $set。
javascript 复制代码
const obj = reactive({ key: 'value' });
obj.newKey = 'newValue'; // 自动触发响应式更新
  • 删除属性 :直接通过 delete obj.key 删除属性即可触发响应式更新,无需手动调用 $delete。
javascript 复制代码
delete obj.key; // 自动触发响应式更新
  • 修改属性:直接修改属性值可触发响应式更新。
javascript 复制代码
obj.key = 'newValue'; // 自动触发响应式更新

二、数组操作对比

1. Vue 2 的数组操作

新增元素 :需使用数组变异方法(如 push、unshift、splice)或通过 $set 修改索引。

javascript 复制代码
this.items.push(newItem); // 触发响应式更新
this.$set(this.items, this.items.length, newItem); // 触发响应式更新


一、对象(Object)操作

1. 添加/修改属性

javascript 复制代码
// ❌ 错误 - 不会触发响应式更新
this.obj.newKey = 'value'

// ✅ 正确 - Vue 2
this.$set(this.obj, 'newKey', 'value')

// ✅ 正确 - Vue 3
import { reactive } from 'vue'
const obj = reactive({})
obj.newKey = 'value'  // Vue 3 中可以直接添加

// ✅ 正确 - 重新赋值(两种版本都适用)
this.obj = {
  ...this.obj,
  newKey: 'value'
}

2. 删除属性

javascript 复制代码
// ❌ 错误
delete this.obj.property

// ✅ 正确 - Vue 2
this.$delete(this.obj, 'property')

// ✅ 正确 - Vue 3
delete this.obj.property  // Vue 3 中可以直接删除

// ✅ 正确 - 重新赋值
const { property, ...rest } = this.obj
this.obj = rest

3. 嵌套对象操作

javascript 复制代码
// ✅ 正确 - 深度修改
this.$set(this.user, 'profile', { name: 'John' })

// ✅ 嵌套属性修改
this.$set(this.user.profile, 'age', 25)

// ✅ 使用 Vue 3 Composition API
import { reactive } from 'vue'
const state = reactive({
  user: {
    profile: {}
  }
})
state.user.profile.name = 'John'  // 自动响应

二、数组(Array)操作

1. 变异方法(可触发响应式更新)

javascript 复制代码
// ✅ push - 末尾添加
this.items.push(newItem)
this.items.push(item1, item2, item3)  // 添加多个

// ✅ pop - 末尾删除
this.items.pop()

// ✅ shift - 开头删除
this.items.shift()

// ✅ unshift - 开头添加
this.items.unshift(newItem)

// ✅ splice - 增删改
// 删除:从索引2开始删除1个元素
this.items.splice(2, 1)

// 替换:从索引2开始删除1个元素,添加新元素
this.items.splice(2, 1, newItem)

// 添加:从索引2开始删除0个元素,添加新元素
this.items.splice(2, 0, newItem)

// ✅ sort - 排序
this.items.sort((a, b) => a - b)

// ✅ reverse - 反转
this.items.reverse()

2. 非变异方法(需要重新赋值)

javascript 复制代码
// ❌ 错误 - 不会触发更新
this.items[0] = 'newValue'

// ✅ 正确 - 使用 Vue.set
this.$set(this.items, 0, 'newValue')

// ✅ 正确 - 使用 splice
this.items.splice(0, 1, 'newValue')

// ✅ 正确 - 修改长度
this.items.splice(newLength)  // 截断数组

3. 数组替换操作

javascript 复制代码
// 过滤数组
this.items = this.items.filter(item => item.id !== id)

// 映射数组
this.items = this.items.map(item => 
  item.id === id ? { ...item, value: 'updated' } : item
)

// 添加元素(非变异方式)
this.items = [...this.items, newItem]

// 合并数组
this.items = [...this.items, ...newItems]
复制代码
相关推荐
lpfasd1237 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse4569 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai9 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记10 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁10 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu10 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!11 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格11 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人11 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid11 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet