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

Vue 的双向绑定原理,Vue2 和 Vue3 双向绑定原理的区别

Vue 的双向绑定原理,Vue2 和 Vue3 双向绑定原理的区别

Vue 的双向绑定(Two-way Data Binding)是其核心特性之一,其本质是通过数据劫持结合发布-订阅模式实现的。以下是 Vue2 和 Vue3 在双向绑定原理上的区别和演进:


文章目录

  • Vue 的双向绑定原理,Vue2 和 Vue3 双向绑定原理的区别
      • **1. Vue2 的双向绑定原理**
        • **(1) 数据劫持(Data Observation)**
        • **(2) 依赖收集与派发更新**
        • **(3) 局限性**
      • **2. Vue3 的双向绑定原理**
        • **(1) 基于 Proxy 的数据劫持**
        • **(2) 依赖管理优化**
        • **(3) 性能优势**
      • **3. Vue2 与 Vue3 的双向绑定对比**
      • **4. 代码示例对比**
        • **Vue2 的响应式实现**
        • **Vue3 的响应式实现**
      • **总结**

1. Vue2 的双向绑定原理

Vue2 基于 Object.defineProperty 实现数据劫持,核心流程如下:

(1) 数据劫持(Data Observation)
  • 对象属性监听:通过 Object.defineProperty 递归遍历对象的每个属性,将其转换为 getter/setter

    Object.defineProperty(obj, key, {get() { return value; },set(newVal) {value = newVal;dep.notify(); // 通知依赖更新}
    });
    
  • 数组监听:无法直接监听数组下标变化,需重写数组的 push/pop/shift/unshift/splice/sort/reverse 方法。

(2) 依赖收集与派发更新
  • Dep(依赖管理器):每个属性对应一个 Dep 实例,用于收集依赖(Watcher)。
  • Watcher(观察者):组件渲染时触发 getter,将 Watcher 添加到 Dep 中;数据变化时触发 setter,Dep 通知所有 Watcher 更新视图。
(3) 局限性
  • 无法监听新增/删除属性:需通过 Vue.setVue.delete 手动触发响应。
  • 数组监听不完善:通过索引修改数组元素(如 arr[0] = 1)或修改数组长度不会触发更新。

2. Vue3 的双向绑定原理

Vue3 改用 Proxy 替代 Object.defineProperty,并重构了响应式系统,主要改进如下:

(1) 基于 Proxy 的数据劫持
  • 代理整个对象Proxy 直接代理整个对象,无需递归遍历属性,性能更高。

    const proxy = new Proxy(obj, {get(target, key) { /* 收集依赖 */ },set(target, key, value) { /* 触发更新 */ }
    });
    
  • 天然支持数组和新增属性:通过 Proxy 可以直接监听数组索引变化和对象属性增删。

(2) 依赖管理优化
  • 依赖存储结构:使用 WeakMapMap 存储依赖关系,避免内存泄漏。
  • 响应式 API:提供 reactive(对象)和 ref(基本类型)等函数,响应式逻辑与组件解耦。
(3) 性能优势
  • 惰性依赖收集:仅在访问属性时收集依赖,减少初始化开销。
  • 更细粒度的更新:通过 Proxy 精准定位变化,避免 Vue2 中全量对比的性能损耗。

3. Vue2 与 Vue3 的双向绑定对比

特性Vue2(Object.defineProperty)Vue3(Proxy)
数据劫持方式递归遍历属性,逐个劫持代理整个对象,无需递归
数组监听需重写数组方法,无法监听索引赋值直接监听数组索引变化
新增/删除属性需手动调用 Vue.set/Vue.delete自动触发响应
性能初始化递归遍历性能较差初始化更快,更新更高效
兼容性支持 IE9+不支持 IE,需兼容环境使用 @vue/compat

4. 代码示例对比

Vue2 的响应式实现
// 对象响应式
function observe(obj) {Object.keys(obj).forEach(key => {let value = obj[key];const dep = new Dep();Object.defineProperty(obj, key, {get() {dep.depend(); // 收集依赖return value;},set(newVal) {value = newVal;dep.notify(); // 触发更新}});});
}
Vue3 的响应式实现
// 基于 Proxy 的响应式
function reactive(obj) {return new Proxy(obj, {get(target, key, receiver) {track(target, key); // 收集依赖return Reflect.get(target, key, receiver);},set(target, key, value, receiver) {Reflect.set(target, key, value, receiver);trigger(target, key); // 触发更新return true;}});
}

总结

  • Vue2:通过 Object.defineProperty 实现数据劫持,需手动处理数组和新增属性,性能较低但兼容性好。
  • Vue3:基于 Proxy 重构响应式系统,自动支持动态属性/数组变化,性能更高且 API 更简洁。

文章转载自:

http://TpbgiDGO.nzfyx.cn
http://beE6NO11.nzfyx.cn
http://DSY0vK7r.nzfyx.cn
http://eUTAtwdF.nzfyx.cn
http://dtRmGLhR.nzfyx.cn
http://omx3PSmR.nzfyx.cn
http://Gt3loNbS.nzfyx.cn
http://EjZPBFmL.nzfyx.cn
http://i2A3k40a.nzfyx.cn
http://1sHfeiFA.nzfyx.cn
http://01y3VjtJ.nzfyx.cn
http://gV5aNpI9.nzfyx.cn
http://VoW6blGR.nzfyx.cn
http://ToHEtsOL.nzfyx.cn
http://8hLVCbZ5.nzfyx.cn
http://8FjvE5xm.nzfyx.cn
http://NPg6Xqp2.nzfyx.cn
http://T2XqQ9cD.nzfyx.cn
http://ISCnGi0S.nzfyx.cn
http://3FSlWz2N.nzfyx.cn
http://wU785oAv.nzfyx.cn
http://Nd7JdzHS.nzfyx.cn
http://DEFvvXgP.nzfyx.cn
http://gJkR1d76.nzfyx.cn
http://hogYeMRz.nzfyx.cn
http://FnHMbQuj.nzfyx.cn
http://Iju5wVsU.nzfyx.cn
http://4bAJPLhQ.nzfyx.cn
http://QUxpFyUu.nzfyx.cn
http://bLLWaRd6.nzfyx.cn
http://www.dtcms.com/a/173726.html

相关文章:

  • 两数之和(暴力+哈希查找)
  • 《AI大模型应知应会100篇》第50篇:大模型应用的持续集成与部署(CI/CD)实践
  • Linux内核视角:线程同步与互斥的原理、实现与锁优化策略
  • 网络安全的范式革命:从被动防御到 AI 驱动的主动对抗
  • Kotlin Android开发过渡指南
  • Kotlin Lambda优化Android事件处理
  • AI服务器的作用都有哪些?
  • PDF内容搜索--支持跨文件夹多文件、组合词搜索
  • Axure :列表详情、列表总数
  • Linux 磁盘初始化与扩容操作手册
  • Blender 初学者指南 以及模型格式怎么下载
  • 电子电器架构 --- 网关转发时延解析
  • GEC6818蜂鸣器驱动开发
  • UE5 Daz头发转Blender曲线再导出ABC成为Groom
  • 【Django】REST 常用类
  • 2025年03月电子学会青少年软件编程 图形化二级考级真题——风车
  • HCIP(OSPF的优化)
  • 【计网】ICMP、IP、Ethernet PDU之间的封装关系
  • 微服务架构详解
  • 基于ASP.NET+MySQL实现待办任务清单系统
  • 宁德时代区块链+数字孪生专利解析:去中心化身份认证重构产业安全底座
  • Jupyter Notebook为什么适合数据分析?
  • Linux56 YUM源配置
  • C语言_可变参数_LOG宏
  • 《AI大模型应知应会100篇》第49篇:大模型应用的成本控制策略
  • 5.6 react组件化开发基础
  • ABAQUS三维CT重建插件CT2Model3D V2版本
  • 前端取经路——JavaScript修炼:悟空的九大心法
  • kaggle注册问题
  • Kafka Consumer的auto.offset.reset参数有哪些配置?适用场景?