vue源码记录

63 阅读2分钟

1、数据观测

1、初始化时获取data,判断data类型,可以是函数和对象,建议是函数
2、通过递归来深层次的观测
3、用object.defineProprietry的getset方法来将数据变成可观测的,针对于与对象
4、重写数组方法,将其观测数组的变化,对数组的处理是有缺陷的,比如直接修改索引和通过索引修改数组长都是不会响应式

2、模板编译

1、模板转成ATS语法树
2、将ATS语法树生成成render函数
3、调用render函数生成虚拟dom,同时会获取数据
4、将虚拟don渲染成真实dom

3、依赖收集

Dep和Watcher关系:
    多对多:
        1、一个组件对应一个Watcher,一个属性对应一个Dep
        2、一个视图可以有多个组件,一个属性可以在多个组件被使用,所以一个Dep对应了多个Watcher
        3、一个组件可以使用多个不同的属性,所以一个Watcher包含了多个Dep
    观察者模式
        1、Watcher属于观察者、属性的Dep是被观察者
        2、属性变化,会通知观察者来更新视图
        
Dep依赖收集Watcher
    1、唯一id、subs数组收集Watcher
    2、调用depend,记录当前的Watcher里面Dep的集合
    3、Watcher去重相同的Dep
    4、Dep收集上这个Watcher

Watcher记录Dep
    1、唯一id、deps记录添加的Dep
    2、addDep记录依赖,会去重,相同属性的Dep只会添加一个
    3、update通知视图更新
    
    // 数据观测的get、set方法
    get() {
        dep.depend() // 收集依赖 模板解析时会访问绑定的变量触发get添加依赖
    }
    set() {
        dep.notify() // 数据变化通知更新
    }
    
    // Dep类
    notify() {
        this.subs.forEach(watcher => watcher.update()) // subs收集的依赖通知Watcher去更新视图
    }

......还在完善,未完待续