一级a做爰片就线在看网站wordpress 搜索模板

web/2025/10/8 0:59:40/文章来源:
一级a做爰片就线在看网站,wordpress 搜索模板,广州哪家做网站最好,万网注册域名查询官方网站文章目录 背景实现能力手撸开始demo流程拆解实现 render 函数构建 fiber 树处理工作单元实现 create fiber加入 diff fiber 的逻辑 commit 阶段hooks 实现 源码地址参考文章 背景 前文中学习了 react 中核心的 fiber 架构#xff0c;时间切片#xff0c;双缓存等#xff0c… 文章目录 背景实现能力手撸开始demo流程拆解实现 render 函数构建 fiber 树处理工作单元实现 create fiber加入 diff fiber 的逻辑 commit 阶段hooks 实现 源码地址参考文章 背景 前文中学习了 react 中核心的 fiber 架构时间切片双缓存等接下来这篇文章实操实现一个 mini-react巩固我们学习的这些知识。 React 探秘(一)fiber 架构 React 探秘(二)双缓存技术 React 探秘(三) 时间切片 实现能力 fiber 架构时间切片双缓存调和 create/diff fiberhooks-useState 手撸开始 demo 我们以一个简单的 Counter 函数组件为例进行分析 function Counter() {const [state, setState] Didact.useState(2);return (h1 onClick{() { setState(c c 1) }} styleuser-select: noneCount: {state}/h1); } const element Counter /; const container document.getElementById(root); MiniReact.render(element, container);流程拆解 入口 render 函数 初始化 workInProgress 开启 workLoop workLoop 函数 时间切片切分任务 vdom 转化为 fiber 节点 调和的过程 create/diff commit 阶段 处理 fiber 中不同类型的节点同步真实 dom 实现 render 函数 render 为我们的入口函数传入组件和根节点根据这两个数据初始化初始化我们的 workInProgress, 在 commit 完成之后才会进行 current 替换。 let workInProgress null; let currentRoot null; let deletions null; let nextUnitOfWork null;// 此处的 element 为 { typefunction Counter() } function render(element, container) {workInProgress {dom: container,props: {children: [element]},alternate: currentRoot};deletions [];// 开启工作单元nextUnitOfWork workInProgress; }构建 fiber 树 根据上面得到的 fiber 根节点构建 fiberNode构建过程需要把 vdom 转化为 fiber 其中进行 create/diff子元素通过 child 连接兄弟节点通过 sibling 连接 return 记录父节点用作遍历。 本文 jsx 转化采用简单方式带过 每个 fiberNode 为一个工作单元循环构建 fiberNode直到没有fiberNode处理完所有的工作单元之后进入 commit 阶段。 /** 两种实现方式* 1. 采用 requestIdleCallback 模拟* 2. 宏任务实现 schedule * */ // requestIdleCallback 时间切片 function workLoop() {while (nextUnitOfWork) {// 得到下一个工作单元nextUnitOfWork performUnitOfWork(nextUnitOfWork);}// 没有fiber并且wip存在if (!nextUnitOfWork workInProgress) {commitRoot();} } requestIdleCallback(workLoop)// 2. 宏任务时间切片 // 参考文章 https://juejin.cn/post/7428168209709449268 function workLoop() {// 执行 shouldYieldToHost 来判断本次宏任务的 高频短间隔5ms 时间切片是否用尽while (!shouldYieldToHost() nextUnitOfWork) {performUnitOfWork();}if (nextUnitOfWork) {console.log(开启下一个宏任务继续执行剩余任务);return true;} else {return false;} }处理工作单元 performUnitOfWork 为核心处理方法, 分为两个步骤 fiber 节点的构建 create 阶段 diff 阶段 Counter 组件的执行 得到 vdom 初始化 hooks function performUnitOfWork(fiber) {// beginWorkconst isFunctionComponent fiber.type instanceof Function;if (isFunctionComponent) {// Counter 组件的执行updateFunctionComponent(fiber);} else {// fiberNode的构建updateHostComponent(fiber);}if (fiber.child) {return fiber.child;}let nextFiber fiber;// fiber 的循环操作 父-子-兄while (nextFiber) {if (nextFiber.sibling) {return nextFiber.sibling;}nextFiber nextFiber.return;} } // Counter 组件的执行 function updateFunctionComponent(fiber) {wipFiber fiber;hookIndex 0;wipFiber.hooks [];const children [fiber.type(fiber.props)];reconcileChildren(fiber, children); } // fiberNode的构建 function updateHostComponent(fiber) {if (!fiber.dom) {fiber.dom createDom(fiber);}reconcileChildren(fiber, fiber.props.children); }第一次先构建根节点构建完成后 放入 wipFiber.child 中然后进行下一个工作循环此时 type 为 Counter 的 fucntion 执行该方法初始化 hooks 的值和得到 vdom 进行调和完成该 fiber 节点的构建一直复该动作直到没有其他节点. 实现 create fiber 接下来我们实现一下核心的调和的过程: 首先是 create fiber通过elementsvdom生成我们的 fiber 结构并打上 PLACEMENT 表示新增 function reconcileChildren(wipFiber, elements) {let index 0;let prevSibling null;while (index elements.length) {const element elements[index];let newFiber null;if (element !sameType) {newFiber {type: element.type,props: element.props,dom: null,return: wipFiber,alternate: null,effectTag: PLACEMENT};}if (index 0) {wipFiber.child newFiber;} else if (element) {prevSibling.sibling newFiber;}prevSibling newFiber;index;} }加入 diff fiber 的逻辑 create fiber 有了, 接下来我们实现一下 diff 的过程. diff 首先找到旧的 fiber 判断旧 fiber type 和 新的 vdom type 是否相同, 相同的话复则用 dom 信息, 打上 UPDATE 的标签。不同的话创建新的 fiber打上 PLACEMENT 标签。 如果 old fiber 存在, 但是 type 却不相同则把这个节点放入 deletions 数组打上 DELETION 标签 function reconcileChildren(wipFiber, elements) {console.log(reconcileChildren,elements);let index 0;let oldFiber wipFiber.alternate wipFiber.alternate.child;let prevSibling null;// 循环构造 child 和 sibing while (index elements.length || oldFiber ! null) {const element elements[index];let newFiber null;// 判断 type 是否相同const sameType oldFiber element element.type oldFiber.type;// 相同的话,复用 domif (sameType) {newFiber {type: oldFiber.type,props: element.props,dom: oldFiber.dom,return: wipFiber,alternate: oldFiber,effectTag: UPDATE};}if (element !sameType) {newFiber {type: element.type,props: element.props,dom: null,return: wipFiber,alternate: null,effectTag: PLACEMENT};}// 老节点塞入deletionsif (oldFiber !sameType) {oldFiber.effectTag DELETION;deletions.push(oldFiber); }if (oldFiber) {oldFiber oldFiber.sibling;}if (index 0) {wipFiber.child newFiber;} else if (element) {prevSibling.sibling newFiber;}prevSibling newFiber;// 遍历 props.children 数组节点index;} }commit 阶段 在得到 fiber 树之后,进入我们的同步真实 dom 的过程. 这个阶段是不可暂停的, 采用递归的方式完成 fiber 的同步. function commitRoot() {deletions.forEach(commitWork);commitWork(workInProgress.child);// 渲染完成后, 双缓存树的替换currentRoot workInProgress;workInProgress null; }// 下面为核心代码 function commitWork(fiber) {// 根据type 判断执行 if (fiber.effectTag PLACEMENT fiber.dom ! null) {domParent.appendChild(fiber.dom);} else if (fiber.effectTag UPDATE fiber.dom ! null) {updateDom(fiber.dom, fiber.alternate.props, fiber.props);} else if (fiber.effectTag DELETION) {commitDeletion(fiber, domParent);}// 递归操作 fiber 树 commitWork(fiber.child);commitWork(fiber.sibling); } hooks 实现 根据之前对 fiber 学习我们知道 hooks 在 fiber 上的存储也是以链表的数据结构存储存储在 memoizedState 上。 const [state, setState] useState(0) 根据用法我们可以推断出: 该方法返回值 return [state, setState], state 是一个状态setState 是改变状态的方法。根据特性 state 变更组件会 reRender 的特性推测出setState 在计算出最新的值后会重启 workLoop。 function useState(initial) {// setState 后初始化 oldHookif (!oldHook) {oldHook wipFiber.alternate?.memoizedState}// 每次进入重新构建 hookconst hook {state: oldHook ? oldHook.state : initial,queue: [],next: oldHook ? oldHook.next : null,};// 拿到当前 hook 的任务队列const actions oldHook ? oldHook.queue : [];// 计算最新的 state actions.forEach(action {hook.state action(hook.state);});// 构建 hook 链表if (!workInProgressHook) {workInProgressHook hookwipFiber.memoizedState workInProgressHook;} else {workInProgressHook workInProgressHook.next hook}// 获取下一个 hook oldHook oldHook oldHook.nextconst setState action {hook.queue.push(action);// 重新构建 workInProgressworkInProgress {dom: currentRoot.dom,props: currentRoot.props,alternate: currentRoot};oldHook nullworkInProgressHook null// 设置下一个工作单元 reRendernextUnitOfWork workInProgress;deletions [];};return [hook.state, setState]; }至此我们就基本完成了一个简单的 mini-react上面代码直接截取了关键代码如果感兴趣的话可以结合下面源码进行本地调试。 源码地址 mini-react https://github.com/lovelts/mini-react/blob/master/src/index.js 参考文章 react 源码 workLoop https://github.com/facebook/react/blob/v18.3.1/packages/react-reconciler/src/ReactFiberWorkLoop.new.js beginWork https://github.com/facebook/react/blob/v18.3.1/packages/react-reconciler/src/ReactFiberBeginWork.new.js schedule https://github.com/facebook/react/blob/v18.3.1/packages/scheduler/src/forks/Scheduler.js commitWork https://github.com/facebook/react/blob/v18.3.1/packages/react-reconciler/src/ReactFiberCommitWork.new.js hooks https://github.com/facebook/react/blob/v18.3.1/packages/react-reconciler/src/ReactFiberHooks.new.js build-your-own-react https://pomb.us/build-your-own-react/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家居设计网站模板厦门网站排名

音视频采集API false表示不采集,true表示采集 WebRTC API适配 获取音视频设备的访问权限 通过 return navigator.mediaDevices.enumerateDevices();/*返回一个promise,为了获取音视频的权限*/ 视频约束

做微网站公司名称抖音代运营报价明细表

最近收到深圳市通信管理局的违法违规APP处置通知大概如下: 并且详细列举了 facebook sdk 在未经用户允许前调用的 TelephonyManager.getNetworkOperatorName(); 方法,获取运营商名称. 解决方法, 首先 在用户没有点击允许隐私条款前 不要调用任何Facebook sdk 方法,比如: Fac…

珠海网站建设怎么样网页设计与制作教程用户注册

实验任务描述: 用VS2008构造ASP.NET站点开发环境;用ASP.NET完成JavaScript开发调试;用Ext3.0.0完成一个简单的树显示站;WebService程序设计,Dijstra最短路Web 服务;JavaScript通过Ajax技术调用WebService;一、Windows下WEB共享设置 打开你的WINDOWS,鼠标点开“我的电脑”…

浙江省邮电工程建设有限公司网站企业网站的建设水平直接关系到网络营销的效果

#方法一:命令行设置 ##1.在macOS 操作系统中,你可以通过以下步骤使用图形界面来设置 PYTHONPATH 环境变量 (1)点击屏幕左上角的苹果图标,在弹出菜单中选择 “系统偏好设置”。 (2)在系统偏好设…

长沙做网站nn微联讯点很好直播功能开发

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?预备知识如图,这是一个4位数码管模块,由两片 74HC595 级联控制,引脚如图,从上到下,分别为VCC(3.3V/5V),…

网站改版用新空间好吗青海城乡和住房建设厅网站

1. 首先查看当前的python版本 python -V 2. 进入已经激活的conda环境,搜索库中有无想要的python版本(若有想安装的版本可跳过) conda search --full --name python 3. 安装库中存在且符合要求的python版本即可(以python3.8.1为例) conda install python3.8.1

网站备案 手印随便网站建设pc指什么

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的,这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与…

国外网站app外贸站外推广

阅读导航 本文背景 代码实现 本文参考 源码 1. 本文背景 WPF中垂直导航菜单大家应该都常用,本文介绍使用MVVM的方式怎么绑定菜单,真的很简单。 2. 代码实现 使用 .Net Core 3.1 创建名为 “MenuMVVM” 的WPF模板项目,添加两个Nuget库&…

太原网站设计排名武城做网站

在 iPhone 应用里,有时我们想强行把显示模式从纵屏改为横屏(反之亦然),CocoaChina 会员 “alienblue” 为我们提供了两种思路第一种:通过人为的办法改变view.transform的属性。具体办法:view.transform一般…

您没有足够的权限访问该页面 wordpress济南百度seo

目录 一、Typora简介二、Typora安装三、Typora补丁四、Typora使用体验五、总结 一、Typora简介 Typora是一款非常流行的Markdown编辑器,它能够将Markdown文本转化为漂亮的排版,并且支持实时预览。Typora具有简单易用的界面,使得用户可以轻松地…

产品报价网站建设费用常州制作企业网站

开发的时候有时候会遇到一种情况,比如 :点击这个链接跳转到其他组件的情况,通常会跳转到新的页面,蛋是,我们不想跳转到新页面,只在当前页面切换着显示,那么就要涉及到路由的嵌套了,也…

隆化县建设局网站建造网站需要什么

B 不同子串题目描述一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。请问,字符串0100110…

免费自助建站系统哪个好wordpress 主机和域名绑定域名

回调函数是非常重要的概念 文章目录1 函数的类型2 函数指针2.1 函数指针的使用2.2 使用函数指针实现回调函数3 总结1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己的类型的。函数也是有自己的类型的。 函数的类型由返回值、参数的类型、参数的个…

此网站可能有网页开发外包

一、面试题 很多同学的简历都写着熟悉 SpringBoot, 而 Starter 的实现原理被当作的考题的的情况越来越多。 来源牛客网关于 starter 的一些面试题 情景一、路虎一面 情景二、蔚来 情景三、同花顺 Starter 频频出现,因此在面试准备时,这道题…

网站设计一般包括哪些南昌seo优化

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统高校实习管理系统信息管理难度大,容错率低&am…

织梦做的网站如何上线竞价单页网站制作

适用于各种智能编译器,HB-X,VSCode,ST3,IDEA等。 问题: 按一下键盘上的,insert 键。

郑州网站推广哪家效果好做网站经常加班还是app

qq群号:16708579加入时声明来自cnblogs希望大家加进来不只是灌水。 转载于:https://www.cnblogs.com/cfans/archive/2005/11/19/280132.html

安徽网站排名wordpress幻灯片不动

返回:OpenCV系列文章目录(持续更新中......) 上一篇:如何利用OpenCV4.9离散傅里叶变换 下一篇: 目标 本文内容主要介绍: 如何使用 YAML 或 XML 文件打印和读取文件和 OpenCV 的文本条目?如何对 OpenCV …

南宁网站推广大全建设解锁卡网站首页

一、光源分类 环境光(AmbientLight):会均匀的照亮场景中的所有物体。无方向,不能投射阴影。平行光(DirectionalLight):沿特定方向散发的光,发出的光线都是平行的。例如太阳光,可投射阴影。点光源(PointLight)&#xf…

厦门网站建设哪家专业梅州网站建设梅州

Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性,通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…