patchVnode

  // 对比新旧节点,vnode渲染成真实dom,并返回vnodefunction patchVnode(oldVnode: VNode,vnode: VNode,insertedVnodeQueue: VNodeQueue) {const hook = vnode.data?.hook;// 首先执行用户设置的 prepatch钩子函数;hook?.prepatch?.(oldVnode, vnode);const elm = (vnode.elm = oldVnode.elm)!;const oldCh = oldVnode.children as VNode[];const ch = vnode.children as VNode[];// 如果新老 vnode相同直接返回if (oldVnode === vnode) return;if (vnode.data !== undefined) {// 执行模块的update钩子函数for (let i = 0; i < cbs.update.length; ++i)cbs.update[i](oldVnode, vnode);// 执行用户设置的update钩子函数vnode.data.hook?.update?.(oldVnode, vnode);}// 如果 vnode.text未定义if (isUndef(vnode.text)) {// 如果新老节点都有 childrenif (isDef(oldCh) && isDef(ch)) {// 使用diff算法对比子节点,更新子节点if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);} else if (isDef(ch)) {// 如果新节点有children,老节点没有children// 如果老节点有text,清空dom元素的内容if (isDef(oldVnode.text)) api.setTextContent(elm, "");// 批量添加子节点addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);} else if (isDef(oldCh)) {// 如果老节点有children,新节点没有children// 批量移出子节点removeVnodes(elm, oldCh, 0, oldCh.length - 1);} else if (isDef(oldVnode.text)) {// 如果老节点有text,情况DOM元素api.setTextContent(elm, "");}} else if (oldVnode.text !== vnode.text) {// 如果没有设置vnode.textif (isDef(oldCh)) {// 如果老节点有 children,移出removeVnodes(elm, oldCh, 0, oldCh.length - 1);}// 设置DOM元素的textContent 为 vnode.textapi.setTextContent(elm, vnode.text!);}// 最后执行用户设置的postpatch钩子函数hook?.postpatch?.(oldVnode, vnode);}

Snabbdom(虚拟dom-9-patchVnode函数)相关推荐

  1. 十二、虚拟 DOM 和 render() 函数(1)

    本章概要 虚拟DOM render()函数 Vue.js 之所以执行性能高,一个很重要的原因就是它的虚拟 DOM 机制. 12.1 虚拟 DOM 浏览器在解析 HTML 文档时,会将文档中的元素.注释 ...

  2. React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期

    React简介: 前面只是简单介绍移动APP开发,后面还会继续深入介绍移动app开发:其中想要用ReactNative开发出更出色的应用,那么就得学好React,下面将介绍React: React 是 ...

  3. Github每日精选(第61期):虚拟 DOM 走向未来 million

    million million 使创建用户界面像React一样简单,但为最终用户提供更快的性能和更小的包大小.通过使用编译器预先计算用户界面,Million 减少了传统 Virtual DOM 的开销 ...

  4. React框架简介(JSX语法、组件、虚拟DOM渲染)

    目录 React框架 为什么要学习React React特点 React核心 JSX语法 语法详解 React开发过程 实际DOM 虚拟DOM React组件 函数组件 类组件 虚拟DOM渲染过程 R ...

  5. Vue 这更新是要抛弃虚拟 DOM ?

    最近 Vue 在美国举办了 Vue Conf 2022,不过可惜的是在国内并未掀起任何的波澜,于是我来试试能不能一石激起千层浪,因为尤雨溪在 Vue Conf 上说他们正在探索一种新的编译策略. 流行 ...

  6. 解密虚拟 DOM——snabbdom 核心源码解读

    本文源码地址:https://github.com/zhongdeming428/snabbdom 对很多人而言,虚拟 DOM 都是一个很高大上而且远不可及的专有名词,以前我也这么认为,后来在学习 V ...

  7. 【Virtual DOM】虚拟 DOM 和 Snabbdom 库

    前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 Virtual DOM 基本介绍 什么是 Virtual DOM Virtual DOM(虚拟 DOM),是由普通的的 ...

  8. 虚拟DOM 之 Snabbdom 一、基本介绍

    Snabbdom 接口介绍(Snabbdom@1.0.1) 官方文档 当前snabbdom版本为 @1.0.1.接口介绍在官方文档的基础上做扩展,新版本接口使用基本和@0.7.4差不多. Snabbd ...

  9. html5新的dom函数,从0到1: 实现一个虚拟 DOM(上)

    写在前面 本文分上下两篇,实现一个基础版本的虚拟 DOM. 上篇首先介绍什么是虚拟 DOM.为什么要使用虚拟 DOM,其次完成项目创建.实现 h 函数.render 函数以及 mount 函数,完成创 ...

  10. 面试中的网红虚拟DOM,你知多少呢?深入解读diff算法

    深入浅出虚拟DOM和diff算法 一.虚拟DOM(Vitual DOM) 1.虚拟DOM(Vitual DOM)和diff的关系 2.真实DOM的渲染过程 3.虚拟DOM是什么? 4.解决方案 - v ...

最新文章

  1. SpringBoot线程池的创建、@Async配置步骤及注意事项
  2. 高薪程序员的5个工资档次
  3. ulua/tolua中timer.lua和event.lua的使用(Luaframework)
  4. mysql模式匹配用什么关键字_MYSQL模式匹配:REGEXP和like用法
  5. Linux shell的标准输入、输出和错误
  6. 漫步微积分十八——变化率问题
  7. Django 现可在 Windows Azure 上使用
  8. 关于使用JAVA正则表达式报java.lang.StackOverflowError错误问题
  9. IBatisNet -- 保护你的配置文件及映射文件信息
  10. IE10首个修复补丁出现 解决ASP.NET兼容性
  11. pm模式 raid_Adaptec RAID PM8060 用户手册.pdf
  12. 股票交易成本有哪些费用?
  13. 有n个结构体变量,内含学生学号、姓名、3门课程的成绩,要求输出平均成绩最高的学生信息
  14. 1500ml等于多少l_1500毫升是多少升
  15. 网络工程课程设计_某学校网络设计
  16. 王文彬(淘宝网首席架构师)等关注探讨的问题
  17. 如何重建深层神经网络的可塑性?
  18. 非常有助于理解二极管PN结原理的资料
  19. Vue引入Thee.js 加载obj文件和mtl文件并上纹理贴图
  20. 西门子GPRS模块开发详解

热门文章

  1. 教育部计算机考研大纲,2018考研大纲从哪里看?
  2. linux 内核文件结构,linux-011内核文件结构图
  3. 助力 Android 抗衡 iOS,华为发布方舟编译器!
  4. SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句
  5. java string.substring 参数,Java,String类中的subString()方法,stringsubstring
  6. vue中 vue-router的路由的2种模式 (原生js模拟演示)
  7. 潭州课堂25班:Ph201805201 django框架 第五课 自定义简单标签,包含标签,模型类创建,梳理类创建 (课堂笔记)...
  8. 单例模式——饿汉式和懒汉式
  9. 使用OpenCV提取不同颜色物体
  10. 20145226夏艺华 《Java程序设计》第2周学习总结