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

Vue响应式原理四:响应式-监听属性变化

存在的问题

  1. 每次属性修改后需要手动调用dep.notify()
  2. 容易遗漏导致依赖不更新
  3. 多个属性变更时需要多次调用

解决方案:需要实现属性变化的自动监听机制

一 . 响应式监听属性变化

    1. 方案一:Object.defineProperty -> Vue2
    • 1.1. 实现原理:通过Object.defineProperty()劫持对象属性的set操作

    • 1.2. 关键步骤:

      • 1.2.1. 使用Object.keys()遍历对象所有key
      • 1.2.2. 对每个key执行defineProperty
      • 1.2.3. 在setter中保存新值并通知依赖
    • 1.3. 注意事项:不能直接在setter中设置obj[key]=newValue,会导致无限递归

    • 1.4. 示例代码如下:

    •   	Object.keys(obj).forEach(key => {// 这个是一个闭包let value = obj[key];Object.defineProperty(obj, key, {set: function(newValue) {// 不可以这么做,会形成递归(如果把newValue设置给key,相当于又给这个key设置值了,又会调用set, 然后又设置值,又调用set会形成递归调用)// obj[key] = newValue; value = newValue;// 属性发生变化时自动执行对应的响应式函数dep.notify()},get: function() {return value;}})})
      
    • 1.5. 自动通知机制:

      • 属性修改触发setter
        •   // 修改obj的属性console.log('name发生变化时----------------------------------------');obj.name = 'kobe'```
          
      • setter调用dep.notify()
        •   // 关键代码:set: function(newValue) {// 不可以这么做,会形成递归(如果把newValue设置给key,相当于又给这个key设置值了,又会调用set, 然后又设置值,又调用set)// obj[key] = newValue; value = newValue;// 属性发生变化时自动执行对应的响应式函数dep.notify()} ```
          
    • 1.6. 执行效果:修改obj.name或obj.age时,所有依赖函数自动执行并输出最新值,

      • 在这里插入图片描述
        在这里插入图片描述

      • 在这里插入图片描述

    • 1.7. 代码结构:

      • 外层定义Depend类管理依赖
      • 中间使用defineProperty设置监听属性变化
      • 底层通过watchFn收集依赖
    1. 方案二:new Proxy() -> Vue3 (暂时不写,后面在写)
http://www.dtcms.com/a/271368.html

相关文章:

  • 国密算法(SM2/SM3/SM4)
  • 【MySQL】一些操作:修改MySQL root密码等等
  • Java 多线程编程:原理与实践
  • UI前端与数字孪生结合实践探索:智慧物流的仓储优化与管理系统
  • 供应链管理:定量分析中的无量纲化处理
  • Java 各集合接口常用方法对照表
  • 虚拟化技术,容器技术和Docker
  • Android View 绘制流程 简述 (无限递归+BitMap问题)
  • android activity生命周期温习
  • Java HashMap 的 get 和 put 方法的实现流程
  • android——热修复(补丁)
  • 微软官方C++构建工具:历史演变、核心组件与现代实践指南
  • SQL注入:现象、本质与防御详解
  • 文本标签提取与大模型理解:方法论深度指南
  • Kubernetes 集群部署、配置和验证-使用kubeadm快速部署一个K8s集群_笔记
  • 【K8S】在 Kubernetes 上配置安装 Nginx Ingress 控制器指南
  • 使用LLaMA-Factory微调Qwen2.5-VL-3B 的目标检测任务-LLaMA-Factory训练数据配置
  • 图像处理中的霍夫变换:直线检测与圆检测
  • 【软件运维】前后端部署启动的几种方式
  • 区块链系统开发技术应用构建可信数字生态链
  • 股指期货交割日避坑指南
  • 【MkDocs踩坑】图片路径问题的排查与解决
  • 由 DB_FILES 参数导致的 dg 服务器无法同步问题
  • 【动手学深度学习】4.10 实战Kaggle比赛:预测房价
  • Android API Level 到底是什么?和安卓什么关系?应用发布如何知道自己的版本?优雅草卓伊凡
  • 深度学习预备知识
  • MyBatisPlus-03-扩展功能
  • 基于Matlab多特征融合的可视化指纹识别系统
  • 常见 HTTP 方法的成功状态码200,204,202,201
  • whitt算法之特征向量的尺度