// 在Vue对象创建之前,我们需要对数据进行响应式处理 function defineReactive(obj, key, val) { // 为每个属性创建一个Dep实例 const dep = new Dep(); // 属性配置 Object.defineProperty(obj, key, { // 可枚举 enumerable: true, // 可配置 configurable: true, // 获取属性值时触发 get: function reactiveGetter() { // 将当前订阅者添加到Dep中 if (Dep.target) { dep.addSub(Dep.target); } return val; }, // 设置属性值时触发 set: function reactiveSetter(newVal) { if (newVal === val) { return; } val = newVal; // 通知所有订阅者更新数据 dep.notify(); } }); } // 创建观察者 class Watcher { constructor(vm, key, cb) { this.vm = vm; this.key = key; this.cb = cb; // 在创建Watcher对象时立即将该对象与最新的Dep关联 Dep.target = this; this.vm[this.key]; // 触发getter,添加订阅者 Dep.target = null; // 添加完订阅者后重置 } // 更新数据时调用 update() { this.cb.call(this.vm); } } // Dep用于管理订阅者 class Dep { constructor() { // 存储所有订阅者 this.subs = []; } // 添加订阅者 addSub(sub) { this.subs.push(sub); } // 通知所有订阅者更新数据 notify() { this.subs.forEach(sub => { sub.update(); }); } } // Vue对象 class Vue { constructor(options) { this.$options = options; this._data = options.data; // 将data中的属性转换为响应式数据(使用defineReactive处理) Object.keys(this._data).forEach(key => { defineReactive(this, key, this._data[key]); }); // 创建观察者对象,用于监听数据变化 new Watcher(this, 'updateData', this.render); } // 数据变化时执行的更新方法 updateData() { // 数据变化逻辑处理 console.log('数据发生变化'); } // 渲染方法 render() { // 渲染逻辑处理 console.log('渲染页面'); } } // Vue实例化 const app = new Vue({ data: { title: 'Vue响应式原理学习', content: '数据双向绑定' } });
Vue.js中的响应式原理与Vue数据双向绑定
推荐阅读:
mysql in索引慢查询优化实现步骤解析_Mysql
mysql使用xtrbackup+relaylog增量恢复注意事项_Mysql
深入探究Java原型模式的魅力_java
SpringBoot自动装配的原理与使用_java
vue使用moment如何将时间戳转为标准日期时间格式_vue.js
浅谈Java的Synchronized锁原理和优化_java
基于context.Context的Golang loader缓存请求放大问题解决_Golang
Golang中的泛型你真的了解吗_Golang
mongodb中根据时间过滤进行查询的操作方法_MongoDB
Java lombok中@Accessors注解三个属性的作用_java
一文带你掌握Java ImageIO类_java
Python opencv进行圆形识别(圆检测)实例代码_python
SpringBoot封装响应数据实现过程详解_java
Golang 依赖注入经典解决方案uber/fx理论解析_Golang
详解Java的面向对象和面向过程_java
热门内容:
python包/库安装,解决ImportError: DLL load failed while importing _framework_bindings
pytorch测试GPU是否可用和cudnn检测是否可用
Jupyter Notebook:FileNotFoundError: [WinError 2] 系统找不到指定的文件
excel怎么把重复项合并? excel将相同名字的数据合并在一起的教程_excel_办公软件_软件教程
windows怎么重启服务的命令? Windows服务启动与停止命令的教程_windows_Windows系列_操作系统
win11蜘蛛纸牌在哪 win11玩蜘蛛纸牌游戏的方法_windows11_Windows系列_操作系统
如何用ps调整贴图明暗色差的颜色? ps中调整色彩明暗度的的技巧_photoshop教程
win10开机10秒倒计时怎么取消? Win10取消开机倒计时的三种方法_windows10_Windows系列_操作系统
电脑C盘拒绝访问或打不开怎么办? win11/win10 C盘决绝访问的多种解决办法_windows11_Windows系列_操作系统
WPS如何并排比较两个文档 WPS并排比较两个文档的方法_金山WPS_办公软件_软件教程
WPS打印时如何添加装订线 WPS打印时添加装订线的方法_金山WPS_办公软件_软件教程
怎么关闭chrome/edge浏览器打开外部应用程序的弹窗 禁止广告弹窗的技巧_浏览下载_软件教程
WPS表格筛选后如何恢复原本的所有数据 Excel还原筛选的数据的方法_金山WPS_办公软件_软件教程
win10搜索不到指定内容怎么办? Win10搜索文件功能找不到文件的多种解决办法_windows10_Windows系列_操作系统
Win11更新失败资源管理器崩溃无限重启怎么解决?_windows11_Windows系列_操作系统
WPS饼图如何设置为分离性饼图 WPS饼图设置为分离性饼图的方法_金山WPS_办公软件_软件教程
wps表格无法拖动怎么回事? WPS Excel单元格无法拖拽移动的解决方法_金山WPS_办公软件_软件教程
WPS幻灯片中如何添加创意图形 WPS幻灯片中添加创意图形的方法_金山WPS_办公软件_软件教程
Win11系统保护在哪? Win11关闭Windows保护的技巧_windows11_Windows系列_操作系统
WPS表格如何设置四舍五入取整 WPS表格设置数字四舍五入取整方法_金山WPS_办公软件_软件教程