• ① 响应式系统的基本原理


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

    1 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 函数:通过 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 对象时,就会将 data 中的数据进行响应式化

    改变 data 属性值,就会触发 cb 方法更新视图

    let o = new Vue({
        data: {
            test: 'I am test.'
        }
    });
    o._data.test = 'Hello world'; // 视图更新啦~
    
  • 相关阅读:
    【AS3代码】AS调用JS
    【AS3代码】MP3音乐的播放/暂停/设定音量大小
    【AS3代码】在上下文菜单(右键菜单)中添加自定义项
    【AS3代码】更换鼠标箭头样式,并跟随鼠标!
    【AS3代码】创建动态文本
    【AS3代码】播放FLV视频流的三步骤!
    【AS3代码】Timer计时器用法
    【AS3代码】指定间隔时间运行函数 及 停止运行函数
    【AS3代码】Keyboard键盘操作!
    多线程_传送带我们到底能走多远系列(6)
  • 原文地址:https://www.cnblogs.com/pleaseAnswer/p/14331113.html
Copyright © 2020-2023  润新知