// 在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数据双向绑定
推荐阅读:
Python使用get_text()方法从大段html中提取文本的实例_python
Vue+ElementUI项目使用webpack输出MPA的方法_vue.js
Redis全量复制与部分复制示例详解_Redis
简单易懂Pytorch实战实例VGG深度网络_python
Android WebView支持input file启用相机/选取照片功能_Android
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法_jquery
Springboot源码 TargetSource解析_java
Nodejs中使用puppeteer控制浏览器中视频播放功能_node.js
python多任务之协程的使用详解_python
python数组循环处理方法_python
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解_javascript技巧
python中利用numpy.array()实现俩个数值列表的对应相加方法_python
关于Python中的向量相加和numpy中的向量相加效率对比_python
iOS实现文字水平无间断滚动效果_IOS
sql在一个表中添加字段并添加备注的方法_Mysql
热门内容:
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_办公软件_软件教程