博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue.js 响应式原理
阅读量:4569 次
发布时间:2019-06-08

本文共 1921 字,大约阅读时间需要 6 分钟。

1. Vue2.x 基于 Object.defineProperty 方法实现响应式(Vue3 将采用 Proxy)

Object.defineProperty(obj, prop, descriptor)

2. 定义 defineReactive 来对对象的属性进行 getter、setter 操作

function defineReacive(obj, key, val){    Object.defineProperty(obj, key, {        enumerable: true,        configurable: true,        get() {            return val;        },        set(newVal) {            if(val === newVal) return;            val = newVal;            callback(newVal);        }    })}

3. 我们需要遍历所有数据,所以需要 observer 方法去观察

function observer(val){    if(!val || typeof val !== 'object') return;    Obejct.keys(val).forEach(key => {        defineReactive(val, key, val(key));    })}

4. 模拟 Vue 构造函数

class MockVue {    constructor(options) {        this._data = opations.data;        observer(this._data);    }}

5. 实例化 MockVue 生成实例对象

let v1 = new MockVue({    data: { }})

如何让发生变动时触发相关视图更新,那么我们就需要收集依赖,

6. 订阅者 Dep(存放watcher观察者对象)

class Dep {    constructor() {        this.subs = [];    }    addSub(sub) {        this.subs.push(sub);    }    notify() {        this.subs.forEach(sub => {            sub.update();        })    }}

7. 观察者 Wacher

class Watcher {    constructor() {        Dep.target = this;    }    update() {        console.log('update...');    }}

8. 修改 defineReactive 方法

function defineReacive(obj, key, val){    + const dep = new Dep();     Object.defineProperty(obj, key, {        enumerable: true,        configurable: true,        get() {            + dep.addSub(Dep.target);             return val;        },        set(newVal) {            if(val === newVal) return;            val = newVal;            - callback(newVal);            + dep.notify();         }    })}

9. 重写 MockVue

class MockVue {    constructor(options) {        this._data = options.data;        observer(this._data);        new Watcher();               // Dep.target会指向这个watcher对象        console.log('触发getter');    }}

转载于:https://www.cnblogs.com/colima/p/10508913.html

你可能感兴趣的文章
dict使用
查看>>
ASP.NET MVC的帮助类HtmlHelper和UrlHelper
查看>>
02_ListActive中响应事件 并LogCat输出
查看>>
doubleclick adx note
查看>>
Celery框架
查看>>
[c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息
查看>>
[转载,感觉写的非常详细]DUBBO配置方式详解
查看>>
linux Valgrind使用说明-内存泄漏
查看>>
Android在Eclipse上的环境配置
查看>>
面向对象(五)
查看>>
android平台下使用点九PNG技术
查看>>
Python学习3,列表
查看>>
最长回文子串
查看>>
JAVA基础-JDBC(一)
查看>>
js中for和while运行速度比较
查看>>
算法第5章作业
查看>>
7.9 练习
查看>>
基于ArcGIS JS API的在线专题地图实现
查看>>
learnByWork
查看>>
lua 函数
查看>>