美文网首页
vue原理理解

vue原理理解

作者: JLong | 来源:发表于2021-11-10 15:53 被阅读0次

响应式数据原理(参考https://juejin.cn/post/6844903597986037768)

Observer(响应式绑定)、Dep(依赖收集)、Watcher(订阅者)

个人理解

Vue在初始化时候会调用initDate()方法,通过vm.$options.data获取数据,调用Observer()方法进行对数据进行观测也就是响应式绑定:
1. 是否被观测过,有就return
2. 是否是对象:
    (1)对象(非数组):调用walk()方法,使用Object.keys()遍历对象属性,——重复步骤
    (2)数组:将数组__proto__指向改写的arrayMethods方法,这个方法主要拦截改写数组七个改变自身数值方法(push、pop、shif、unshift、splice、sort、reverse),对新增的元素进行观测,——重复步骤
      (3)  非对象:——重复步骤

重复步骤:并调用defineReative这个方法重写了defineProperty的get、set方法,get方法调用了dep.depend()收集当前属性与watcher有关的 依赖。set方法则监听该属性,当不一致时,调用dep.notify(),进而调用当前属性对应所有Watcherupdate()方法进行更新。

简单实现:https://juejin.cn/post/68449041464248238220

双向绑定:

let vue = {
    $data = { a: 1, b: 2 }
}
for(let key in vue.$data) {
    Object.defineProperty(Vue, key, {
        configurable: true, // 可配置
        enumerable: true, // 可枚举
        get() {
            return value.$data[key]
        },
        set(newV) {
            value.$data[key] = newV
        }
    })
}

Diff算法:(https://juejin.cn/post/6994959998283907102)

概念:

虚拟dom: 用来表示真实dom的对象

虚拟DOM算法操作真实DOM,性能高于直接操作真实DOM,虚拟DOM和虚拟DOM算法是两种概念。

dif算法:是一种对比算法,用以对比新旧虚拟节点,找出更改数据并更新对应的真实节点,而不用更新没有改变的部分节点,实现精确更新真实节点,进而提高效率。

新旧虚拟DOM对比的时候,Diff算法比较只会在同层级进行, 不会跨层级比较。 所以Diff算法是:深度优先算法。 时间复杂度:O(n)

个人理解diff算法对比流程:

当数据改变时,触发defineReative方法改写的Object.defineProperty的set()方法,进而调用dep.notify()通知所有依赖该属性的订阅者watcher进行更新,订阅者们就会调用patch()方法,也就是diff算法对比,给真实DOM打补丁,更新相应视图。

patch( 补丁)方法调用isSameVnode判断同层新旧虚拟节点是否相同,不相同直接整个接点替换成新虚拟节点,更新视图;相同则继续执行patchVnode()方法进行深层比对。

patchVnode()主要进行5个判断
先获取真实节点el。
1. 判断newVnode、oldVnode是否是同一个对象,如果是,return。
2. 判断是否有文本节点并且不相同,则el文本节点设置为newVnode文本节点。
3. 判断OldVnode有子节点,NewVnode没有子节点,则删除el子节点。
4. 判断OldVnode没有子节点,NewVnode有子节点,则el添加NewVnode子节点。
5. 判断两者都有子节点,执行updataChildren()方法比较子节点。 

updataChildren()主要通过首尾对比算法对子节点进行对比。主要进行5个判断:(真实Node和旧虚拟Node是相同的)
1. oldS和newS调用sameVnode()判断,相同真实Node对应old节点位置移动到new节点对应位置,oldS++, newS++ ,不同则不动。
2. oldS和newE调用sameVnode()判断,相同真实Node对应old节点位置移动到new节点对应位置, oldS++, newE--  ,不同则不动。
3. oldE和newS调用sameVnode()判断,相同真实Node对应old节点位置移动到new节点对应位置,oldE--, newS++  ,不同则不动。
4. oldE和newE调用sameVnode()判断,相同真实Node对应old节点位置移动到new节点对应位置,oldE--, newE-- ,不同则不动。
5. 如果以上逻辑都匹配不到,再把所有旧子节点key做一个key -> index映射表,再用新Vnode的key对应映射表找到旧Vnode可复用位置,然后真实Node对应old节点位置移动到new节点对应位置。
6. 最后oldS>oldE时,则旧子节点遍历完成,对比新旧节点长度,多了插入对应位置,少了删除对应节点。

具体代码看https://juejin.cn/post/6994959998283907102

相关文章

  • 关于vue常见的题目

    1. 简述vue响应式原理 2. 计算属性的原理 3. Vue.nextTick 原理 用法: 理解:nextTi...

  • Vue原理解析(十):搞懂事件API原理及在组件库中的妙用

    ** 上一章** Vue原理解析(九):监听属性watch和计算属性computed实现原理 在vue内部初始化时...

  • vue面试相关

    javascript面试总结 谈谈你对MVVM开发模式的理解 Vue 有哪些指令? 简述Vue的响应式原理 Vue...

  • vue面试题

    MVVM、MVC的理解 VUE相对jquery有什么优点,谈谈你对虚拟dom的理解 有没有对vue底层实现原理有研...

  • 页面跳转----基于Vue和PHP打造前后端分离的通用管理系统(

    Vue单页应用的跳转,大部分使用Vue-router。要理解Vue-router的原理,首先要会Vue自带的

  • vue响应式原理

    谈谈阅读了vue深入响应式原理后的理解 1.响应式原理 在生成vue实例时,为对传入的data进行遍历,使用Obj...

  • Vue的34道题

    1、如何理解MVVM原理? MVVM的实现原理 2、响应式数据的原理是什么? 响应式数据与数据依赖基本原理vue双...

  • Vue 原理解析

    用vue也有很长一段时间,用它做过移动端项目 pc项目 SaaS平台等等,总体来说vue 还是相对于简单的、建立于...

  • 理解 Vue 组件原理

    此处考虑 *.vue 单文件第一次 render 的情况。 每个 *.vue 都会被 vue-loader 编译成...

  • vue原理理解

    响应式数据原理(参考https://juejin.cn/post/6844903597986037768) Obs...

网友评论

      本文标题:vue原理理解

      本文链接:https://www.haomeiwen.com/subject/zuzlzltx.html