① 响应式系统的基本原理
1 Object.defineProperty
Vue.js基于
Object.defineProperty
实现响应式系统
使用方法:
/*
* obj: 目标对象
* prop: 需要操作的目标对象的属性名
* descriptor: 描述符
* return value 传入对象
*/
Object.defineProperty(obj, prop, descriptor)
descriptor
的属性
enumberable
: 属性是否可枚举,默认 falseconfigurable
: 属性是否可被修改|删除,默认 falseget
: 获取属性的方法set
: 设置属性的方法
2 实现 observer
(可观察的)
简化过程:不考虑数组等复杂情况,只处理对象
1. 定义函数 cb
模拟视图更新,调用 cb
即代表更新视图
function cb (val) {
// 渲染视图
console.log('视图更新啦~');
}
2. 定义 defineReactive
函数
defineReactive
函数通过 Object.defineProperty
来实现对对象的响应式化
入参
obj
需要绑定的对象key
obj的某一个属性val
具体的值
经过 defineReactive
处理后
- obj 的 key 属性在 读 时会触发
reactiveGetter
方法 - 该属性被 写 时会触发
reactiveSetter
方法
function defineReactive (obj, key, val) {
Object.defineProperty(obj, key, {
enumberable: true,
configurable: true,
get: function reactiveGetter () {
return val; // 实际上会收集依赖
},
set: function reactiveSetter (newVal) {
if (newVal === val) return;
val = newVal;
cb(newVal);
}
})
}
3. 封装一层 observer
传入一个 value
(需要响应式化的对象),通过遍历所有属性的方式对该对象的每一个属性都通过 defineReactive
处理
实际上 Observer 会进行递归调用
function observer (value) {
if(!value || (typeof value !== 'object')) {
return;
}
Object.keys(value).forEach(key => {
defineReactive(value, key, value[key]);
});
}
3 封装 Vue
1. 构造函数
在 Vue 的构造函数中,对 options
的 data
进行处理,这里的 data
就是 Vue 实例中的 data
属性
data 实际上是一个函数,这里当作一个对象简单处理
class Vue {
// Vue构造类
constructor (options) {
this._data = options.data;
observer(this._data);
}
}
2. new Vue
new
一个 Vue 对象时,就会将 data
中的数据进行响应式化
改变 data 属性值,就会触发
cb
方法更新视图
let o = new Vue({
data: {
test: 'I am test.'
}
});
o._data.test = 'Hello world'; // 视图更新啦~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)