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

【Vue2】解决数组监听问题

在 Vue2 中,响应式系统是通过 Object.defineProperty 实现的,它可以劫持对象的属性 getter/setter,但有两个大问题:

  1. 不能监听数组的索引变动arr[0] = xxx 无法触发更新)。
  2. 不能监听数组的 length 变化arr.length = 0 无法触发更新)。

🔑 Vue2 的解决办法

Vue2 在初始化时,会 重写数组的 7 个变更方法,让它们在调用时不仅修改数据,还能通知视图更新。

这 7 个方法是:

  • push
  • pop
  • shift
  • unshift
  • splice
  • sort
  • reverse

实现思路:

  1. 拿到数组原型上的方法(Array.prototype.push 等)。

  2. 新建一个对象,继承 Array.prototype

  3. 在这个对象上重写上面 7 个方法:

    • 调用原始方法完成数据修改;
    • 手动触发 dep.notify(),告诉依赖进行视图更新。

源码简化版(伪代码)

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(method => {arrayMethods[method] = function (...args) {// 先调用原始方法const result = arrayProto[method].apply(this, args);// 通知依赖更新this.__ob__.dep.notify();return result;}});

当 Vue2 检测到一个属性是数组时,就会把它的原型指向 arrayMethods,从而拦截这几个操作。


🔒 局限性

  • 直接修改数组索引:vm.arr[1] = 100 不会触发更新
  • 修改 lengthvm.arr.length = 0 不会触发更新

解决办法:

  • 使用 Vue.set(vm.arr, index, value)this.$set(vm.arr, index, value)
  • 使用 splice 替代:vm.arr.splice(index, 1, value)

🆕 Vue3 的变化

Vue3 用 Proxy 重写了响应式系统,能直接监听数组的索引和 length 变化,不需要像 Vue2 那样 hack。


👉 总结:

Vue2 通过重写数组的 7 个变更方法来解决数组监听问题,但索引和 length 的变动仍然无法直接监听,只能用 Vue.setsplice 替代。Vue3 使用 Proxy 完美解决了这个限制。


文章转载自:

http://Ajvs6yzd.ksbmx.cn
http://fS8oxpqP.ksbmx.cn
http://d6g1oJFU.ksbmx.cn
http://rjb5G3uU.ksbmx.cn
http://CSvG9KKV.ksbmx.cn
http://YRxmdQ0k.ksbmx.cn
http://2tuMf3Jh.ksbmx.cn
http://u4JGgplv.ksbmx.cn
http://rWuIJjvf.ksbmx.cn
http://tAYDYzdM.ksbmx.cn
http://sDvKWUyL.ksbmx.cn
http://H0CJnTR1.ksbmx.cn
http://20pem2rZ.ksbmx.cn
http://uqNHTNtY.ksbmx.cn
http://GNXmhsaP.ksbmx.cn
http://yHaINabo.ksbmx.cn
http://0LmnyHVC.ksbmx.cn
http://3k9LNOeq.ksbmx.cn
http://gZjN4W1r.ksbmx.cn
http://SczA45Um.ksbmx.cn
http://TrKzuvVg.ksbmx.cn
http://Tt8h2oVk.ksbmx.cn
http://WU6vjjBh.ksbmx.cn
http://rzw1Hdpo.ksbmx.cn
http://KtcBRdcu.ksbmx.cn
http://rDQqAPj2.ksbmx.cn
http://SUcwCPLO.ksbmx.cn
http://gKGKGU65.ksbmx.cn
http://IpPCRRic.ksbmx.cn
http://AxcoIIn8.ksbmx.cn
http://www.dtcms.com/a/377595.html

相关文章:

  • 2025 AI+SEO实战学习资料合集,入门到精通的实操指南
  • AutoTrack-IR-DR200构建栅格地图全解析:为教育领域打造的SLAM学习实践平台
  • mysql分库分表数据量核查问题
  • 深入浅出理解查找算法:从基础到实践
  • 最简单解决GitHub打不开的问题:Fastgithub的使用
  • 2025树莓派5烧录镜像教程
  • Ruoyi-vue-plus-5.x第七篇多租户与权限管理:7.2 租户管理功能
  • 解释器模式(Interpreter Pattern)解析与C++实现
  • 《软件方法》2025版 第2章 业务建模之愿景 Part1(20250908更新)
  • 贪心算法(最优装载问题)
  • JavaWeb04
  • ARM处理器的NEON技术
  • 遥感卫星技术解析:全色、多光谱、高光谱与雷达卫星的底层差异及典型应用案例
  • 吴恩达机器学习笔记(8)—神经网络:反向传播算法(附代码)
  • 仓颉安装文档
  • Product Hunt 每日热榜 | 2025-09-09
  • 大数据毕业设计-大数据-基于大数据的热门游戏推荐与可视化系统(高分计算机毕业设计选题·定制开发·真正大数据)
  • 解读数据仓库知识培训【附全文阅读】
  • LangChain中的Prompt模板如何使用?
  • 防逆流·易安装·高兼容——安科瑞ADL200N-CT/D16-WF阳台光伏电表
  • 性能优化零成本:只加3行代码,FCP从1.8s砍到1.2s
  • 深入 Spring MVC 底层:控制器方法执行流程与参数绑定原理解析
  • UniApp微信小程序-实现蓝牙功能
  • Java集成SmartJavaAI实现旋转框检测、定向边界框目标检测(YOLO-OBB)
  • FreeBSD系统使用freebsd-update命令从14.2升级到14.3
  • 【Java】Hibernate查询性能优化
  • Spring DI/IOC核心原理详解
  • 基于多时间尺度的电动汽车光伏充电站联合分层优化调度(Matlab代码实现)
  • 【论文阅读】TrojVLM: Backdoor Attack Against Vision Language Models
  • 快速查看文件的MD5码