码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【拆解Vue3】渲染器是如何实现的(下篇)?


    节点的更新与删除

    在前面的文章中,我们已经能够对简单的vnode进行渲染。但前面我们实习的渲染是一次性的,实际开发中,我们需要重新渲染复杂节点的能力。为了实现这一点,我们考虑对前面实现的代码进行重构。先从创建渲染器的代码出发。

    const renderer = createRender(DOMOptions)
    renderer.render(vnode, document.querySelector('#app')) // (1)
    renderer.render(newVNode, document.querySelector('#app')) // (2)
    renderer.render(null, document.querySelector('#app')) // (3) 
    

    在上面这段示例中,我们定义了一个构造器,(1)处传入vnode节点进行了初次渲染,(2)处给出了一个新的newVNode节点进行了更新,(3)处传入null卸载已经渲染的节点。

    这里需要着重说明的是更新。最简单暴力的更新方式是删除旧的DOM,重新渲染新的DOM。但是不要忘了,虚拟DOM在性能上不如直接操作DOM来的快,之所以使用虚拟DOM,关键就在于虚拟DOM仅会进行必要的更新,通过减少更新的次数和规模,来间接提高前端项目的整体性能。Vue中使用diff算法来进行必要的更新,进行diff的前提是,我们需要保留旧vnode,与新vnode进行对比。

    function createRender(options) {const { createElement, setElementText, insert } = optionsfunction patch(oldNode, newNode, container) { // (4)if(!oldNode) {mountElement(newNode, container)}}function render(vnode, container) { if(vnode) { // (5)patch(container._vnode, vnode, container)}container._vnode = vnode // (6)}function mountElement(vnode, container) {const el = createElement(vnode.type)if(typeof vnode.children === 'string') {setElementText(el, vnode.children)}insert(el, container)}return {render}
    } 
    

    按照上面的思路,在(4)处新增了一个patch函数,并在render中调用该函数。在patch中,我们需要提供新DOM与旧DOM进行对比,在(6)处我们特地利用container保留了挂载在container上的vnode。重构后,我们就可以利用patch的参数来判断当前是要进行挂载,更新还是删除。

    • 挂载:oldNode为空,newNode不为空;
    • 更新:oldNode不为空,newNode不为空;
    • 删除:oldNode
  • 相关阅读:
    win10 安装 Langchain-Chatchat 避坑指南(2023年9月18日v0.2.4版本,包含全部下载内容!)
    Vue54-浏览器的本地存储webStorage
    做项目管理有且有必要了解并学习的重要知识--PMP项目管理
    Go语言高级编程:深度挖掘
    已解决SyntaxError: invalid character ‘(‘ (U+FF08)
    【软件测试】自动化测试selenium(二)
    快解析——好用的内网安全软件
    Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
    华为认证HCIA H12-811 Datacom数通考试真题题库【带答案刷题必过】【第四部分】
    python自动化面试常见排序算法解析
  • 原文地址:https://blog.csdn.net/qq_53225741/article/details/126957595
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号