当前位置: 首页 > news >正文

Vue3响应式系统中,对象新增属性、数组改索引、原始值代理的问题如何解决?


url: /posts/a0af08dd60a37b9a890a9957f2cbfc9f/
title: Vue3响应式系统中,对象新增属性、数组改索引、原始值代理的问题如何解决?
date: 2025-11-11T07:54:39+08:00
lastmod: 2025-11-11T07:54:39+08:00
author: cmdragon

summary:
Vue3的响应式系统基于Proxy实现,跟踪对象属性的读取和修改操作,但存在局限性。对于对象,新增或删除属性无法自动触发响应,可通过set/delete函数、扩展运算符或初始定义所有属性解决。对于数组,直接修改索引或长度早期版本不响应,推荐使用数组变异方法或set函数。reactive无法代理原始值,需使用ref。实践中,购物车功能通过ref包裹数组、computed计算总价及使用数组变异方法实现响应式更新。

categories:

  • vue

tags:

  • 基础入门
    • Vue3
  • 响应式系统
  • Proxy
  • 数组变异方法
  • 购物车功能
  • 常见报错
  • 规避方案

cmdragon_cn.png

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/

一、响应式系统的工作原理

Vue3的响应式系统基于Proxy实现,通过代理对象(或数组)跟踪属性的读取get)和修改set)操作。当属性变化时,Vue会自动触发依赖更新,同步视图。

但Proxy并非“全能”——它只能跟踪初始存在的属性已知的变更操作,对于一些“非常规”修改(如新增属性、直接修改数组索引),无法自动触发响应,需要我们手动规避。

二、对象的局限性:新增/删除属性不响应

1. 问题描述

reactive创建的响应式对象,新增属性删除属性时,无法触发视图更新。因为Proxy默认只跟踪对象初始化时的已有属性,新增/删除的属性不在初始跟踪范围内。

示例(错误用法):

import { reactive } from 'vue';const user = reactive({ name: 'Alice' });// 新增属性:视图不更新
user.age = 20;// 删除属性:视图不更新
delete user.name;
2. 规避方案

针对对象的新增/删除操作,Vue3提供了3种标准解决方案:

(1) 使用set/delete函数

setVue.set的简写)用于向响应式对象新增属性deleteVue.delete的简写)用于删除属性,两者都会触发响应式更新。

示例(正确用法):

import { reactive, set, delete as vueDelete } from 'vue';const user = reactive({ name: 'Alice' });// 新增响应式属性
set(user, 'age', 20); // 视图更新为 { name: 'Alice', age: 20 }// 删除响应式属性
vueDelete(user, 'name'); // 视图更新为 { age: 20 }
(2) 扩展运算符生成新对象

通过扩展运算符...)创建新对象,替换原对象。新对象会继承原对象的响应式能力,触发视图更新。

示例:

const userRef = ref({ name: 'Alice' }); // 用ref包裹对象// 新增属性:生成新对象
userRef.value = { ...userRef.value, age: 20 }; // 响应式更新
(3) 初始定义所有可能的属性

如果提前知道对象的所有属性,可以在reactive初始化时就定义(值为undefined),后续修改时会自动触发响应。

示例:

const user = reactive({ name: 'Alice', age: undefined }); // 初始定义ageuser.age = 20; // 响应式更新(视图显示20)

三、数组的局限性:直接修改索引/长度不响应

http://www.dtcms.com/a/596292.html

相关文章:

  • HTTP接口和Dubbo接口区别
  • K8S中ETCD高可用机制详解
  • jmeter发送数据到sasl加密的kafka
  • 【MATLAB代码】二维平面的TOA定位,GDOP(几何精度因子)和CRLB(克拉美罗下界)计算与输出
  • 【Hadoop】Hadoop核心基础——YARN 框架架构与运行机制(Hadoop 集群的 “资源管家”)
  • MI50运算卡使用llama.cpp的ROCm后端运行gpt-oss-20b的速度测试
  • 聊聊关于hive“中文乱码”问题
  • 一般建设网站需要多少预算酷站 网站
  • ASP.NET 实战:用 CSS 选择器打造一个可搜索、响应式的书籍管理系统
  • 消息队列防止数据丢失问题
  • Spring Cloud Bus 事件广播机制
  • 广州巨腾建网站公司郑州网站app开发
  • 银河麒麟服务器安装图形化界面
  • 【源码+文档+调试讲解】基于Spring Boot的考务管理系统设计与实现 085
  • LeetCode 421 - 数组中两个数的最大异或值
  • 【笔记】xFormers版本与PyTorch、CUDA对应关系及正确安装方法详解
  • 【GitHub每日速递 20251111】PyTorch:GPU加速、动态网络,深度学习平台的不二之选!
  • 多产品的网站怎么做seo做音乐网站之前的准备
  • 网站如何做h5动态页面设计万网备案初审过了后网站能访问吗
  • centos运维常用命令
  • 在CentOS 7.6系统中找回或重置 root 密码
  • 濮阳团购网站建设手机网站模板psd
  • 基于Spring Boot的电子犬证管理系统设计与实现
  • Spring Boot 中的定时任务:从基础调度到高可用实践
  • 家装设计师网站wordpress小清新模板
  • 用WordPress制作单页相城seo网站优化软件
  • wordpress主题wpmee江门网站优化排名
  • 淮安设计网站苏州网站建设相关技术
  • 公司的网站开发费计入什么科目济南传承网络李聪
  • 营销类型的公司网站物联网平台功能