讲师中心 微信公众号
AI工具推荐 视频效率加速

Vue.js Reactive 响应式实现:对象与数组的深度劫持

风磊小哥_5846

风磊小哥_5846

发布时间:2026-07-16 17:04:04

|

958人浏览过

|

来源于php中文网

原创

Vue.js响应式核心是数据“可追踪”和“可通知”:Vue2用Object.defineProperty递归劫持对象属性并重写数组变异方法,Vue3则用Proxy全面接管,提升性能并解决限制。

vue.js reactive 响应式实现:对象与数组的深度劫持

Vue.js 的响应式实现,核心在于让数据“可追踪”和“可通知”。对象与数组的深度劫持不是简单地加个监听器,而是通过一套有层次、有取舍的机制,确保变化能被准确捕获并触发视图更新。

对象的深度劫持:递归 + defineProperty

Vue2 使用 Object.defineProperty 对对象每个属性做单层劫持。但普通对象可能嵌套多层,比如 user.profile.address.city。为保证深层属性变化也能响应,Vue 在初始化时递归遍历:

  • 遇到普通对象,就调用 observe 创建 Observer 实例,并用 walk 遍历其所有自有属性
  • 对每个属性执行 defineReactive,设置 getter(收集依赖)和 setter(派发更新)
  • 若属性值仍是对象或数组,就再次进入 observe,形成递归观测链

这种设计保障了任意层级的数据修改都能触发更新,但代价是初始化时需遍历全部属性——对象越深、属性越多,首次渲染越慢。

数组的特殊处理:重写变异方法

数组不能靠单纯劫持索引(如 arr[0])来实现响应式,因为索引是数字键,且大量索引逐个 define 会带来巨大性能开销(比如 new Array(10000))。Vue2 的解法是:

立即学习前端免费学习笔记(深入)”;

jm-jsjkxyjs02-pzl-803
jm-jsjkxyjs02-pzl-803

查询全球任意城市的实时天气和未来天气预报

下载
  • 不劫持数组索引本身,而是拦截 7 个会改变原数组的方法:pushpopshiftunshiftsplicesortreverse
  • 在原型上重写这些方法,内部先调用原生逻辑,再手动触发依赖更新
  • 对通过 arr[i] = xxxarr.length = xxx 的修改,无法自动检测,必须用 Vue.setvm.$set

这种方式兼顾了可用性与性能,避免了为每个数组项添加 getter/setter 的开销。

Vue3 的升级:Proxy 全面接管

Vue3 放弃 Object.defineProperty,改用 Proxy 实现响应式:

  • Proxy 可直接代理整个对象或数组,无需递归定义每个属性;新增/删除属性天然可追踪
  • 数组索引赋值(arr[0] = 1)、长度修改(arr.length = 0)均可被拦截,不再需要 Vue.set
  • reactive() 可安全包裹对象和数组,ref() 则用于基础类型,两者内部都基于 Proxy 构建

这不仅解决了 Vue2 的诸多限制,还提升了约 40% 的响应式性能(官方基准测试结果)。

实际开发中的注意点

即便理解了原理,日常编码仍需避开常见陷阱:

  • Vue2 中向响应式对象添加新属性,必须用 this.$set(obj, key, val),否则无响应
  • 直接通过索引设置数组项(arr[1] = 'x')或修改 length,在 Vue2 中无效
  • 使用 Object.freeze() 后的对象不会被劫持,因为它禁止属性变更,defineProperty 会失败
  • Proxy 不兼容 IE,这是 Vue3 放弃 IE 支持的技术原因之一

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
vue2.0和3.0区别
vue2.0和3.0区别

vue2.0和3.0区别:vue2的响应式原理是利⽤“Object.defineProperty()”对数据进⾏劫持结合发布订阅模式的⽅式来实现,vue3中使⽤了es6的proxy API对数据代理,实现对数据的监控。本专题为大家提供vue2.0和3.0区别的相关的文章、下载、课程内容,供大家免费下载体验。

1594

2023.07.17

vue3的生命周期有哪些
vue3的生命周期有哪些

vue3的生命周期:1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

11622

2024.02.23

Vue3组合式API与组件开发实战
Vue3组合式API与组件开发实战

本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

256

2026.02.10

vue.js为什么报错
vue.js为什么报错

vue.js报错的原因:1、语法错误;2、组件使用不当;3、数据绑定问题;4、生命周期钩子使用不当;5、插件或依赖问题;6、路由配置错误;7、异步操作处理不当等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2167

2024.03.11

vue.js插槽有哪些用
vue.js插槽有哪些用

vue.js插槽的作用:1、提高组件的可重用性;2、实现组件的灵活布局;3、实现组件间的数据传递和交互;4、促进组件的解耦和模块化。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2235

2024.03.11

vue.js怎么带参数跳转
vue.js怎么带参数跳转

vue.js带参数跳转的方法:1、定义路由;2、在组件中使用路由参数;3、进行带参数的跳转。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2033

2024.03.11

Vue.js 入门开发与核心语法实战
Vue.js 入门开发与核心语法实战

本教程带你系统掌握 Vue.js 从环境搭建到核心语法实战的完整路径。内容涵盖 Vue CLI 与 Vite 脚手架初始化、模板语法与指令系统、组件化开发与 Props/Emits 通信机制,以及计算属性、侦听器与生命周期钩子的实际应用。通过 TodoList 与个人任务管理器等实战案例,帮助你理解响应式数据绑定与单文件组件开发范式。适合具备 HTML/CSS/JavaScript 基础的前端初学者,快速上手构建现代单页应用。

370

2026.05.15

Vue.js 组件化开发与工程化架构
Vue.js 组件化开发与工程化架构

本教程聚焦 Vue.js 组件化开发与工程化架构两大核心,带你从零构建可维护的企业级前端应用。内容涵盖单文件组件(SFC)的拆分与设计原则、Props/Emits 父子通信、Provide/Inject 跨层级数据传递,以及插槽(Slots)实现灵活布局。工程化部分深入 Vite 构建配置、Pinia 状态管理、Vue Router 路由懒加载与代码分割,并集成 ESLint/Prettier 规范代码质量。通过实战电商后台管理系统,帮

178

2026.05.15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 16.7万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn