首页 > 其他分享 >React 中执行的 DOM 操作

React 中执行的 DOM 操作

时间:2024-08-16 16:51:08浏览次数:4  
标签:node fiber DOM React Fiber 执行 节点

新增/插入

对于需要新增/插入的节点, React 会对 workInProgress fiber.flags 执行按位或 Placement 的操作。表示该 fiber 节点需要执行插入的操作。

执行插入的主要方法是 commitPlacement 。在该方法中会根据当前 Fiber 节点是否存在兄弟 Fiber 节点判断要调用哪种方法。

如果当前 Fiber 节点存在兄弟 Fiber 节点,则获取当前 Fiber 节点相连的兄弟 Fiber 节点对应的真实 DOM 节点,然后执行 parentInstance.insertBefore(child, beforeChild) 执行插入操作。
如果当前 Fiber 节点不存在兄弟 Fiber 节点,则获取父级 fiber 对应的真实 DOM 节点,然后执行 parentInstance.appendChild(child) 执行dom节点的插入。

更新

对于需要更新的节点, React 会对 workInProgress fiber.flags 执行按位或 Update 的操作。表示该 fiber 节点需要执行更新的操作。

React 主要会对三种属性进行处理。

  • style
  • dangerously_set_inner_html
  • children

首先在执行completeWork方法时对于update会调用diffProperties方法分别遍历旧props和新props,接着找出变化的属性,然后组成偶数为key,奇数为value的数组,最后保存到fiber.updateQueue属性上。

在执行更新的操作时,首先会调用commitUpdate方法,最终调用updateDOMProperties方法遍历fiber.updateQueue。

  • 如果key是STYLE,执行的操作是先获取到style = node.style,然后赋值 style[styleName] = styleValue
  • 如果key是DANGEROUSLY_SET_INNER_HTML,执行node.innerHTML = html
  • 如果key是CHILDREN,对于node是文本节点的情况,直接执行node.firstChild.nodeValue = text。否则执行node.textContent = text
  • 否则是其他属性,执行node.setAttribute(attributeName, attributeValue)

删除

对于需要删除的节点,React 会将需要删除的FIber节点保存到父级Fiber节点的deletions数组中。表示这些 Fiber 节点需要执行删除的操作。

执行删除的方法是commitDeletion。首先调用commitNestedUnmounts方法从父Fiber节点递归删除所有子节点,并且还会解绑ref。对于ClassComponent会执行componentWillUnmount生命周期函数。对于FunctionComponent会执行useLayoutEffect的销毁函数。

然后再执行parentInstance.removeChild(child)方法执行dom节点的删除。

标签:node,fiber,DOM,React,Fiber,执行,节点
From: https://www.cnblogs.com/rocenjs/p/18361932

相关文章

  • 【C语言实现花屏效果并打包程序为exe可执行文件】
    说明:该程序为临摹改良(......
  • PHP命令执行与绕过
    一、eval()函数调用--无严格过滤:1、highlight_file()高亮显示:?c=highlight_file(base64_decode("ZmxhZy5waHA="));2、shell命令:?c=system("tacfl*g.php");?c=system("catfl*g.php");3、echo直接打印:(使用反引号包裹shell命令)?c=echo'tacfla*.php';4、......
  • Declarative Shadow DOM
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>&l......
  • JS DOM 对象的节点操作
    目录一、什么是加载时间onload二、各种节点的获取方法1、元素节点的获取(1)通过标签名获取:       document.getElementsByTagName('标签名')(2)通过id获取         document.getElementById('id的名称')2、文本节点的获取举个栗子3、兄弟节点(1)nextSiblin......
  • useState的执行流程
    useStateuseState的工作流程可以分为两步:声明阶段:在组件渲染时执行useState方法调用阶段:触发点击事件时,执行dispatch(通过useState返回的数组的第二个参数)调用阶段首先通过点击事件会执行dispatch方法。在React源码当中dispatch对应的是dispatchAction方法。......
  • React 高德地图 进京证 路线规划 问题小记
    一、加载问题用高德地图做了个进京证路线规划的功能,官网也是有React代码示例。但是吧,这个Demo有问题,地图是能加载成功,但是其他功能再用map这个变量肯定不行,果不其然是null,处理也简单,把公共变量都管理起来就行了。const[map,setMap]=useState(null);const[AMap,setAMa......
  • Linux_开机_关机_重启_的时候执行脚本
    Linux_开机_关机_重启_的时候执行脚本转载注明来源:本文链接来自osnosn的博客,写于2024-08.参考Linux关机时执行指定脚本如何在Systemd下配置并运行关机前的脚本在Linux启动或重启时执行命令与脚本Centos7关机和重启前执行自定义脚本如何在重启或启动时执行命令或脚......
  • md5sum+可执行文件 怎么理解?
    `md5sum`是一个在Unix、Linux以及其他类Unix系统中广泛使用的命令行工具,用于计算和校验文件的MD5哈希值。MD5哈希是一种广泛使用的加密哈希函数,可以产生一个128位(16字节)的哈希值(通常以32位的十六进制数表示),用于验证文件的完整性和一致性。 当你看到`md5sum`与“可......
  • windows-g下载js库使用时报错:无法加载文件 D:\code\node\node_global\create-reac
    无法加载文件D:\code\node\node_global\create-react-app.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅https:/go.microsoft.com/fwlink/?LinkID=135170中的about_Execution_Policies。当我们在windows上-g(全局)安装一个js库时,执行会报这个错误,然后我们看......
  • 使用 TypeScript 在 React JS 中进行路由
    一.介绍单页应用程序(SPA)中的路由支持在视图之间导航,而无需重新加载应用程序。ReactRouter是React应用程序中路由的标准库。本文简要概述了使用TypeScript设置路由的方法。二.设置项目创建一个新的React项目npxcreate-react-appreact-router-ts--template......