zoukankan      html  css  js  c++  java
  • vue实现原理

    Observer

    -通过Object.defineProperty包装为可订阅对象

    Watcher

    • 观察者模式,监听所有可订阅对象变化

    Compile

    • 将对指令、模板等进行解析

    diff算法

    • 同层比较,不会垮层级比较。深度优先
    • 当数据发生改变时,set方法会让调用Dep.notify通知所有订阅者Watcher,订阅者就会调用patch给真实的DOM打补丁,更新相应的视图

    diff算法同层操作

    • 同层,此节点是否被移除=》添加新的节点
    • 属性是否改变=》旧属性改为新属性
    • 文本内容改变=》旧内容改为新内容
    • 节点要被整个替换=》结构完全不相同,移除整个替换

    patch算法

    • 先根据真实DOM生成一颗virtual DOM,当virtual DOM某个节点的数据改变后会生成一个新的Vnode,然后Vnode和oldVnode作对比,发现有不一样的地方就直接修改在真实的DOM上,然后使oldVnode的值为Vnode
    • diff的过程就是调用名为patch的函数,比较新旧节点,一边比较一边给真实的DOM打补丁

    虚拟DOM:本质在JS和DOM之间做一个缓存

    • virtual DOM是将真实的DOM的数据抽取出来,以对象的形式模拟树形结构
    • 用JS对象方式表示DOM树的结构,然后用这个树构建成一个真正的DOM树,插入到文档中
    • 当状态变更的时候,重新构造一棵新的对象树,然后用新的树和旧的树进行比较(diff算法),记录两棵树的差异(生成一个patch对象
    • 把patch补丁对象更新到真正DOM树中

    虚拟DOM中的三个属性

    • tagName:标签名
    • props:包含属性
    • children: 表示该元素的children(数组)

    原因:

    • JS在浏览器中运行很快
    • DOM渲染慢,耗费性能高
    • 渲染真实DOM的开销是很大
    • 如果直接渲染到真实dom上会引起整个dom树的重绘和重排

    vuex存储总结

    • vuex存储在内存中,单页面刷新后,会导致vuex中state数据丢失,初始化。
    • localstorage以文件方式存储在本地
    • sessionStorage会话存储,临时保存
    • localStorage和sessionStorage只能存储字符串类型,对于复杂的对象类型采用JSON.stringify和JSON.parse方式处理
    • vuex主要用于组件之间的传值,localStorage和sessionStorage则主要用于页面间的传值
    • 持久性:vuex会在F5刷新之后清除,sessionStorage会在页面关闭之后清除,localStorage会永久存储(主动清空,或者过期)
    graph TD
       A --> B
    
  • 相关阅读:
    Java数据结构概述·14
    Java之自定义异常·13
    idea spirng项目jsp页面乱码
    HashMap和LinkedHashMap的区别
    jar包导入仓库中
    后台接口接受前端参数的时候使用包装类和基本类型接受
    转 为什么程序员怕改需求?
    thymeleaf常用标签
    linux查看端口占用情况
    查询linux硬件配置
  • 原文地址:https://www.cnblogs.com/nanhuaqiushui/p/11774204.html
Copyright © 2011-2022 走看看