当前位置: 首页 > wzjs >正文

加强网站的建设与管理淄博外贸网站哪家好

加强网站的建设与管理,淄博外贸网站哪家好,重庆市建设银行网站,深圳开发网站开发费用要深入理解 React Hooks 在源码中的实现,可以从以下几个关键方面来剖析: 核心数据结构 在 React 内部,使用链表来管理每个函数组件的 Hooks。每个 Hook 对应一个节点,这些节点通过 next 指针相连。以下是简化后的 Hook 节点结构…

要深入理解 React Hooks 在源码中的实现,可以从以下几个关键方面来剖析:

核心数据结构

在 React 内部,使用链表来管理每个函数组件的 Hooks。每个 Hook 对应一个节点,这些节点通过 next 指针相连。以下是简化后的 Hook 节点结构:

// 简化的 Hook 节点结构
function Hook() {this.memoizedState = null; // 存储当前 Hook 的状态this.baseState = null;this.baseUpdate = null;this.queue = null; // 存储更新队列this.next = null; // 指向下一个 Hook 节点
}

对于每个函数组件,React 会维护一个 fiber 对象,fiber 是 React 内部用于协调渲染的核心数据结构,其中 memoizedState 属性指向该组件 Hooks 链表的头部。

useState 的实现原理

useState 是最常用的 Hook 之一,下面是简化的 useState 实现逻辑:

// 全局变量,用于记录当前正在处理的 fiber
let currentlyRenderingFiber = null;
// 全局变量,用于记录当前正在处理的 Hook
let workInProgressHook = null;function useState(initialState) {// 获取当前的 Hook 节点let hook;if (workInProgressHook === null) {// 如果是首次渲染,创建新的 Hook 节点hook = {memoizedState: initialState,queue: {pending: null},next: null};if (currentlyRenderingFiber.memoizedState === null) {// 如果是该组件的第一个 Hook,将其作为链表头部currentlyRenderingFiber.memoizedState = hook;} else {// 否则,将新 Hook 节点添加到链表末尾let lastHook = currentlyRenderingFiber.memoizedState;while (lastHook.next !== null) {lastHook = lastHook.next;}lastHook.next = hook;}} else {// 如果不是首次渲染,获取当前 Hook 节点hook = workInProgressHook;workInProgressHook = workInProgressHook.next;}// 处理更新队列let baseState = hook.memoizedState;let firstUpdate = hook.queue.pending;if (firstUpdate!== null) {let update = firstUpdate;do {const action = update.action;baseState = action(baseState);update = update.next;} while (update!== null && update!== firstUpdate);hook.queue.pending = null;}hook.memoizedState = baseState;// 返回状态和更新函数const setState = (action) => {const update = {action,next: null};if (hook.queue.pending === null) {update.next = update;} else {update.next = hook.queue.pending.next;hook.queue.pending.next = update;}hook.queue.pending = update;// 触发重新渲染scheduleUpdate();};return [baseState, setState];
}

上述代码中,首次调用 useState 时会创建一个新的 Hook 节点并添加到 Hooks 链表中,后续调用则直接获取对应的 Hook 节点。setState 函数会将更新添加到更新队列中,并触发重新渲染。

useEffect 的实现原理

useEffect 用于处理副作用,下面是简化的 useEffect 实现:

function useEffect(create, deps) {// 获取当前的 Hook 节点let hook;if (workInProgressHook === null) {// 如果是首次渲染,创建新的 Hook 节点hook = {memoizedState: null,next: null};if (currentlyRenderingFiber.memoizedState === null) {currentlyRenderingFiber.memoizedState = hook;} else {let lastHook = currentlyRenderingFiber.memoizedState;while (lastHook.next !== null) {lastHook = lastHook.next;}lastHook.next = hook;}} else {// 如果不是首次渲染,获取当前 Hook 节点hook = workInProgressHook;workInProgressHook = workInProgressHook.next;}// 获取上一次的依赖项const prevDeps = hook.memoizedState? hook.memoizedState[1] : null;let hasChanged = true;if (prevDeps!== null) {hasChanged = false;for (let i = 0; i < deps.length; i++) {if (prevDeps[i]!== deps[i]) {hasChanged = true;break;}}}if (hasChanged) {// 如果依赖项发生变化,添加副作用到待执行队列hook.memoizedState = [() => {const cleanUp = create();return cleanUp;},deps];currentlyRenderingFiber.effects.push(hook.memoizedState[0]);}
}

在 useEffect 中,会比较前后两次的依赖项数组。如果依赖项发生变化,会将副作用函数添加到 fiber 的 effects 数组中,在渲染完成后执行这些副作用。

调用顺序的保证

React 严格依赖于 Hooks 的调用顺序。在每次渲染时,workInProgressHook 会依次指向 Hooks 链表中的每个节点。如果 Hooks 的调用顺序发生改变,会导致 workInProgressHook 无法正确获取对应的 Hook 节点,从而引发错误。

重新渲染和状态更新

当调用 setState 等更新函数时,会触发 scheduleUpdate 函数,该函数会标记当前 fiber 需要重新渲染。React 会重新执行函数组件,再次按顺序调用 Hooks,更新状态和副作用。
以上代码只是简化的实现,实际的 React 源码要复杂得多,包含了大量的错误处理、性能优化和兼容性处理等逻辑。但通过这些简化代码,可以理解 React Hooks 核心的实现原理。


文章转载自:

http://Guxhs8mP.fhqnm.cn
http://4Ptzj35X.fhqnm.cn
http://SeZFczNb.fhqnm.cn
http://gJAbYDTN.fhqnm.cn
http://PLS195fF.fhqnm.cn
http://122rZkGO.fhqnm.cn
http://ZrR7NdDl.fhqnm.cn
http://L0pIVq8p.fhqnm.cn
http://23WHHR1X.fhqnm.cn
http://x00DBQAs.fhqnm.cn
http://tFN5LRS4.fhqnm.cn
http://oC9ymISl.fhqnm.cn
http://T0uEvecg.fhqnm.cn
http://HweuRJjl.fhqnm.cn
http://qvwxtaTK.fhqnm.cn
http://iJYmN0RJ.fhqnm.cn
http://bxCLIReq.fhqnm.cn
http://8E9uY2C0.fhqnm.cn
http://0fOPgcyQ.fhqnm.cn
http://lDLX52Wi.fhqnm.cn
http://mf6XpRrf.fhqnm.cn
http://VI9G9Ut8.fhqnm.cn
http://M1QKg3sT.fhqnm.cn
http://BqKn5aTR.fhqnm.cn
http://NWd02Adc.fhqnm.cn
http://z2TEH0zv.fhqnm.cn
http://6J9ZNAtA.fhqnm.cn
http://vvJ4DpzX.fhqnm.cn
http://JuWDhwPz.fhqnm.cn
http://4Jw3kl5R.fhqnm.cn
http://www.dtcms.com/wzjs/619556.html

相关文章:

  • 江苏连云港网站建设公司手机做wifi中继上外国网站
  • 杭州网站排名优化公司幸福人寿保险公司官方网站电子保单打印
  • 网站底部加编码网站开发技术服务协议
  • 网站开发需要掌握技术有无广告销售版本"有广告免费无广告收费"网站
  • 影视网站视频接口怎么做网站工程师是做什么的
  • 做外贸比较好用的网站网上拿手工做的网站
  • 哪个网络公司做网站好php网站开发职责
  • 中小型网站建设公司平凉哪有做网站的
  • 彩票黑网站是怎么做的wordpress 播放大视频播放
  • 网站做防御wordpress自动更新失败
  • 上市公司做网站有什么用丹阳做网站的公司
  • dede网站首页加悬浮广告前端做网站需要学什么
  • 移动端网站开发项目百度网络推广优化
  • 义乌网站建设哪家好开发网站五个阶段
  • dmoz提交网站wordpress 主题腾讯cdc
  • 找做企业网站毕业设计网页设计论文
  • 张店网站制作设计公司销售渠道
  • 怎样做国外网站学做网站记不住代码
  • 悉知网站建设做视频用的网站有哪些
  • 网站标签图片修改网站微信支付开发
  • 巩义网站建设工程域名注册服务网站查询
  • 专业网站建设的软件个人备案能做企业网站吗
  • 徐州做网站需要多少钱南昌微信营销公司
  • 怎么看网站pr值书法网站模板下载
  • 免费素材网站哪个最好凡科建站是永久的吗
  • 网站建设分工案例如何做好线上营销
  • 手机网站如何建站怎样查看网站是用什么做的
  • 网站活动专题模板辽宁建设工程信息网官网新网站入口
  • 网站建设及推广好学习吗番禺建设网站外包
  • 包装在线设计网站深圳网站建设公司选全通网络