码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • vue源码解析


    vue的虚拟dom与diff算法借鉴了snabbdom
    虚拟dom:
    用javascript对象描述DOM的层次结构。DOM中一切属性都在虚拟DOM中有对应的属性。

    真实DOM
    <div class="box"> 
        <h3>我是一个标题</h3>
        <ul>
            <li>牛奶</li>
            <li>咖啡</li>
            <li>可乐</li>
        </ul>
    </div>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    虚拟DOM
    {
        'sel':"div",
        "data":{
            "class":{
                "box":true
            }
        },
        "children":[
        {
            'sel':"h3",
            "data":{},
            "text":"我是一个标题"
            
        },
        {
            'sel':"ul",
            "data":{},
            "children":[
                {"sel":"li",'data':{},"text":"牛奶"},
                {"sel":"li",'data':{},"text":"咖啡"},
                {"sel":"li",'data':{},"text":"可乐"},
            ]
        }
        ]
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    diff是发生在虚拟DOM上的
    新虚拟DOM和老虚拟DOM进行diff(精细化比较),算出应该如何最小量更新,最后反映到真正的DOM上。

    完整的虚拟节点
    {
    children:undefined,
    data:{},
    elm:undefined,
    key:undefined,
    sel:‘div’,
    text:‘我是一个盒子’
    }

    h函数可以嵌套使用,从而得到DOM树(重要)
    比如这样嵌入使用h函数:
    h(‘ul’,{}[
    h(‘li’,{},‘牛奶’),
    h(‘li’,{},‘咖啡’),
    h(‘li’,{},‘可乐’),
    ]);
    将得到这样的虚拟DOM树:
    {
    “sel”:“ul”,
    “data”:{},
    “children”:[
    {“sel”:“li”,“text”:“牛奶”},
    {“sel”:“li”,“text”:“咖啡”},
    {“sel”:“li”,“text”:“可乐”},
    ]
    }

    diff处理逻辑
    key很重要,key是这个节点的唯一标识,告诉diff算法,在更改前后他们是同一个DOM节点
    只有是同一个虚拟节点,才进行精细化比较,否则就是暴力删除旧的,插入新的。选择器相同且key相同才是同一个虚拟节点。
    只进行同层比较,不会进行跨层比较。即使是同一片虚拟节点,但是跨层了,对不起。精细化比较不diff你,而是暴力删除旧的,然后插入新的。

    在这里插入图片描述

  • 相关阅读:
    qiankun项目搭建手册
    卡莱特在创业板IPO注册获准:业绩实现稳定增长,中金等为股东
    基于连续小波变换的厄尔尼诺海平面周期变化数据集分析
    Django 表单处理:从前端到后台的全流程指南
    [tjctf 2023] crypto,pwn,rev部分
    C#操作GridView控件绑定数据实例详解(二)
    26.原子类操作类
    LLaMA2模型训练加速秘籍:700亿参数效率提升195%!
    QService 服务 指令引用的“0x00000000”内存。该内存不能为“read“
    计算机毕业设计选题推荐-springboot 网上手机销售系统
  • 原文地址:https://blog.csdn.net/weixin_43992788/article/details/120779923
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号