上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

Vue源码学习之虚拟Dom与Diff算法

[复制链接]
  • TA的每日心情
    开心
    2022-7-21 11:43
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    4

    主题

    9

    回帖

    20

    积分

    助理工程师

    积分
    20

    新人报道

    发表于 2022-7-20 09:43:38 | 显示全部楼层 | 阅读模式

    本帖最后由 饭饭欧尼酱 于 2022-7-20 09:47 编辑

    什么是Diff算法?

    diff算法实现精细化对比,实现量小化精细更新
    举个栗子:
    image.png

    什么是虚拟DOM?

    首先我们要知道什么是真实DOM
    举个栗子:

      <div>
            <h1>我是一个标题</h1>
            <ul>
                <li>牛奶</li>
                <li>咖啡</li>
                <li>可乐</li>
            </ul>
        </div>

    那有很多人疑问什么是虚拟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": "可乐" } 
                        ]
                      }
                   ]
       }

    DIff算法是如何更新在虚拟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": "可乐" } 
                        ]
                      }
                   ]
       }
     "sel": "div",
        "data": {
                "class": { "box": true}
                },
        "children": [ 
            {
                "sel": "h3",
                "data": {},
                "text": "我是一个标题"
            }, 
            {
                "sel": "span",
                "data": {},
                "text": "我是一个新的span"
            }
        {
            "sel": "ul",
            "data": {},
            "children": [   
                      { "sel": "li", "data": {}, "text": "牛奶" },
                      { "sel": "li", "data": {}, "text": "咖啡" },
                      { "sel": "li", "data": {}, "text": "可乐" },
                      { "sel": "li", "data": {}, "text": "雪碧" } 
                        ]
                      }
                   ]
       }

    不知道大家通过以上代码有没有发现精细化更新呢?
    简单来说就是新虚拟DOM和旧虚拟DOM进行diff(精细化比较),算出应该如何最小量更新,最后反映到真正的DOM上

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    293

    主题

    3903

    回帖

    3822

    积分

    管理员

    积分
    3822

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-7-20 10:48:48 | 显示全部楼层
    图片咋挂了
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5194

    回帖

    6076

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6076

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-7-20 11:10:17 | 显示全部楼层

    没挂呀
    我这里看着正常
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    293

    主题

    3903

    回帖

    3822

    积分

    管理员

    积分
    3822

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-7-20 14:13:53 | 显示全部楼层

    李恒道 发表于 2022-7-20 11:10

    没挂呀
    我这里看着正常

    woc?
    image.png

    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表