随笔 - 175  文章 - 6  评论 - 0  阅读 - 36429

① 响应式系统的基本原理

1 Object.defineProperty

Vue.js基于 Object.defineProperty 实现响应式系统

使用方法:

/*
 * obj: 目标对象
 * prop: 需要操作的目标对象的属性名
 * descriptor: 描述符
 * return value 传入对象
 */
 Object.defineProperty(obj, prop, descriptor)

descriptor 的属性

  • enumberable: 属性是否可枚举,默认 false
  • configurable: 属性是否可被修改|删除,默认 false
  • get: 获取属性的方法
  • 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 的构造函数中,对 optionsdata 进行处理,这里的 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'; // 视图更新啦~
posted on   pleaseAnswer  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示