JS基础知识2.0(四)虚拟DOM

本文深入探讨虚拟DOM(VDOM)的概念及其在前端开发中的重要作用,解析为何选择VDOM来优化DOM操作,减少浏览器重绘和回流,提升网页性能。文章详细介绍了VDOM的应用方式,通过Snabbdom等开源库的h函数和patch函数展示VDOM的创建和更新过程。同时,阐述了Diff算法的核心流程,解释如何通过算法精准定位需要更新的DOM节点,从而极大提高网页渲染效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Virtual dom


vdom是 vue和react 的核心,哪个都绕不开它,vdom比较独立。使用也比较简单。

问题:
1.vdom是什么?为何会存在vdom?
2.vdom如何应用,核心api是什么?
3.介绍一下diff算法

知识点:
1.vdom是什么,为何使用vdom

virtual dom,虚拟dom
用JS模拟DOM结构
DOM变化的对比,放在JS层来做(图灵完备语言(能实现逻辑复杂性语言))

DOM操作很昂贵。

设计一个需求场景

   <div id="container"></div>
    <button id="btn-change">change</button>
    <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script>
    <script type="text/javascript">
        var data = [
            {
                name: '张三',
                age: '20',
                address: '北京'
            },
            {
                name: '李四',
                age: '21',
                address: '北京'
            },
            {
                name: '王五',
                age: '22',
                address: '北京'
            }
        ]

        //渲染函数
        function render (data) {
            var $container = $('#container')
            // 清空容器
            $container.html('')

            // 拼接 table
            var $table = $('<table>')
            $table.append($('<tr><td>name</td><td>age</td><td>address</td></tr>'))
            data.forEach(function (item) {
                $table.append($('<tr><td>'+ item.name +'</td><td>'+ item.age +'</td><td>'+ item.address +'</td></tr>'))
            })

            //渲染到页面
            $container.append($table)

        }


        $('#btn-change').click(function () {
            data[1].age = 30
            data[2].address = '深圳'
            //re-render 再次渲染
            render(data)
        })

        //页面加载完 立刻执行 (初次渲染)
        render(data)


    </script>


将dom放在最后面就是最后渲染一次,如果放在var table...下面,就是渲染5次

默认创建dom节点属性很多,js模拟更简单点 尽量减少dom操作

总结:
dom操作是昂贵的,JS运行效率高
尽量减少DOM操作,而不是“推倒重来”
项目越复杂,影响就越严重
vdom即可解决这个问题


2.vdom的如何应用,核心API是什么
介绍snabbdom,开源vdom库

h函数,patch函数

建立一个div id为container, 有两个class two,classes  后面是属性,onclick somFn
H 定义一个节点 


空的dom节点,把vnode全放到dom节点里
第二次 对比两个vnode的不同,把不同的更新


核心API

H(‘<标签名>’, {..属性.}, [..子元素.])
H(‘<标签名>’, {..属性.}, ‘..’)
Patch(container, vnode)
Patch(vnode,newVnode)


3.介绍一下diff算法

什么是diff算法


去繁就简
diff算法非常复杂,实现难度很大,源码量很大
去繁就简,讲明白核心流程,不关心细节

vdom为何使用dff算法


dom操作是昂贵的,因此尽量减少DOM操作
找出本次DOM必须更新的节点来更新,其他的不更新
这个找出的过程,就需要DIFF算法


diff实现过程

Patch(container,vnode)
Patch(vnode,newVnode)

不仅仅是以上内容

节点新增和删除
节点重新排序
节点属性,样式,事件绑定
如何极致压榨性能
。。。

diff实现过程
Patch(container,vnode) createElement


Patch(vnode,newVnode) updateChildren

 

总结:
vdom是什么?为何会存在vdom?
vdom如何应用,核心API是什么
介绍一下diff算法

1.virtual dom,虚拟DOM
2.用JS模拟DOM结构
3.DOM操作非常昂贵
4.讲DOM对比操作放在JS层,提高效率

(i)如何使用?可用snabbdom的用法来举例
(ii)核心api:h函数,patch函数

A.是linux的基础命令
B.vdom中应用diff算法是为了找出需要更新的节点
C.实现过程patch(container,vnode) patch(vnode,newVnode)
D.核心逻辑 createElement 和updateChildren
 

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值