国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React源碼解析18(4)------ completeWork的工作流程【mount】

這篇具有很好參考價(jià)值的文章主要介紹了React源碼解析18(4)------ completeWork的工作流程【mount】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

摘要

經(jīng)過(guò)上一章,我們得到的FilberNode已經(jīng)具有了child和return屬性。一顆Filber樹的結(jié)構(gòu)已經(jīng)展現(xiàn)出來(lái)了。

那我們最終是想在頁(yè)面渲染真實(shí)的DOM。所以我們現(xiàn)在要在completeWork里,構(gòu)建出一顆離屏的DOM樹。

之前在說(shuō)FilberNode的屬性時(shí),我們提到過(guò)一個(gè)屬性stateNode。它就是用來(lái)保存每個(gè)FilberNode的真實(shí)DOM。

OK,現(xiàn)在我們開(kāi)干,準(zhǔn)備實(shí)現(xiàn)completeWork。

1.completeWork方法

在completeWork方法里,我們將剛才準(zhǔn)備好的FilberNode(最外層的)傳進(jìn)來(lái)。
completeWork方法也一定是一個(gè)遞歸的過(guò)程,每次調(diào)用的時(shí)候我們要判斷當(dāng)前的FilberNode的tag類型。

在判斷當(dāng)前的FilberNode是否具有stateNode,如果有,就說(shuō)明不是第一次更新。如果沒(méi)有,就說(shuō)明此時(shí)是mount第一次渲染的階段。

export const completeWork = (filberNode) => {
  console.log(filberNode);
  const tag = filberNode.tag
  switch (tag) {
    case HostComponent: {
      if(filberNode.stateNode !== null){
        //更新
      }else{
        completeHostComponent(filberNode)
      }
      break;
    }
    case HostText: {

      break;
    }
    case HostRoot: {
      
    }
  }
}

2.創(chuàng)建真實(shí)DOM

拿到每個(gè)FilberNode后,如果他是HostComponent類型的。我們實(shí)現(xiàn)出completeWork方法。

首先我們可以通過(guò)拿到FilberNode的type(div,span),知道真實(shí)DOM的類型,通過(guò)document的方法創(chuàng)建出對(duì)應(yīng)的element。

然后再通過(guò)return屬性,拿到當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。并且在父節(jié)點(diǎn)的stateNode中,添加創(chuàng)建好的element。

function completeHostComponent(filberNode) {
  const type = filberNode.type;
  const element = document.createElement(type);
  filberNode.stateNode = element;
  const parent = filberNode.return;
  if(parent && parent.stateNode && parent.tag === HostComponent) {
    parent.stateNode.appendChild(element)
  }
  completeWork(filberNode.child)
}

對(duì)于HostText類型,我們可以直接創(chuàng)建文本節(jié)點(diǎn),然后掛載在stateNode上面即可:

function completeHostText(filberNode) {
  const content = filberNode.pendingProps;
  const element = document.createTextNode(content)
  filberNode.stateNode = element
  const parent = filberNode.return;
  if(parent && parent.stateNode && parent.tag === HostComponent) {
    parent.stateNode.appendChild(element)
  }
}

這里值得注意的是,在創(chuàng)建真實(shí)DOM的時(shí)候,這里并沒(méi)有處理props相關(guān)的內(nèi)容。只創(chuàng)建了對(duì)應(yīng)的DOM結(jié)構(gòu)。

3.掛載finishedWork

最后我們將執(zhí)行完beginWork和completeWork的FilberRootNode。掛載在hostRootFilber上面,

function updateContainer(root, element) {
  const hostRootFilber = root.current;
  const update = createUpdate(element);
  hostRootFilber.updateQueue = createUpdateQueue()
  enqueueUpdate(hostRootFilber.updateQueue, update);
  beginWork(hostRootFilber);
  completeWork(hostRootFilber);
  root.finishedWork = hostRootFilber;
}

4.問(wèn)題

這里我們打印一下root,可以看到:
React源碼解析18(4)------ completeWork的工作流程【mount】,react.js,javascript,前端

root的current和finishedWork其實(shí)是一模一樣的,但React其實(shí)并非是這樣處理的。經(jīng)過(guò)beginWork和completeWork處理的節(jié)點(diǎn),并不是最外層的FilberNode,而是它的alternate。

所以我們調(diào)用beginWork和completeWork處理的應(yīng)該是FilberNode的alternate。

5.效果

為了看到效果我們可以寫一個(gè)方法,當(dāng)然這個(gè)方法里面內(nèi)容不可能這沒(méi)少。但是我們可以先實(shí)現(xiàn)一下:

export function commitWork(filberRootNode) {
  const container = filberRootNode.container;
  const child = filberRootNode.finishedWork.child.stateNode;
  container.appendChild(child)
}

然后再beginWork和completeWork執(zhí)行完后,執(zhí)行這個(gè)方法。
就可以看到頁(yè)面正產(chǎn)渲染節(jié)點(diǎn)了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-638807.html

到了這里,關(guān)于React源碼解析18(4)------ completeWork的工作流程【mount】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【PACS源碼】認(rèn)識(shí)PACS的架構(gòu)和工作流程

    【PACS源碼】認(rèn)識(shí)PACS的架構(gòu)和工作流程

    ? ? ? ?PACS系統(tǒng)的基本組成部分包括:數(shù)字影像采集、通訊和網(wǎng)絡(luò)、醫(yī)學(xué)影像存儲(chǔ)、醫(yī)學(xué)影像管理、各類工作站五個(gè)部分。 ? ? ? ? ?而目前PACS系統(tǒng)的軟件架構(gòu)選型上看,主要有C/S和B/S兩種形式。 ? ? ? ?C/S架構(gòu),即Client /Server(客戶機(jī)/服務(wù)器)架構(gòu),將運(yùn)算任務(wù)合理分配到

    2024年02月11日
    瀏覽(22)
  • 【云原生|探索 Kubernetes 系列 5】簡(jiǎn)化 Kubernetes 的部署,深入解析其工作流程

    【云原生|探索 Kubernetes 系列 5】簡(jiǎn)化 Kubernetes 的部署,深入解析其工作流程

    大家好,我是秋意零。 在前面 4 個(gè)章節(jié)中,我們充分了解了容器技術(shù)和 Kubernes 原生時(shí)代引擎的架構(gòu)和設(shè)計(jì)思想,今天分享的主要內(nèi)容是,探索 Kubernetes 部署,深入解析其工作流程 ?? 簡(jiǎn)介 ?? 個(gè)人主頁(yè) : 秋意零 ?? 個(gè)人介紹 :在校期間參與眾多云計(jì)算相關(guān)比賽,如:??

    2024年02月06日
    瀏覽(32)
  • SpringMvc攔截器和手寫模擬SpringMvc工作流程源碼詳解

    SpringMvc攔截器和手寫模擬SpringMvc工作流程源碼詳解

    目錄 1. SpringMvc簡(jiǎn)介 1.1 什么是MVC 1.2 什么是SpringMvc 1.3 SpringMvc 能干什么 1.4 SpringMvc 工作流程 2. SpringMvc攔截器和過(guò)濾器 2.1 攔截器 2.1.1 攔截器作用 2.1.2 攔截器和過(guò)濾器的區(qū)別 2.1.3 攔截器方法說(shuō)明 2.1.4 多個(gè)攔截器執(zhí)行順序 2.1.5 自定義攔截器 2.2?過(guò)濾器(附加) 3. 手寫模擬Spri

    2024年02月09日
    瀏覽(25)
  • 【探索 Kubernetes|集群搭建篇 系列 5】簡(jiǎn)化 Kubernetes 的部署,深入解析其工作流程

    【探索 Kubernetes|集群搭建篇 系列 5】簡(jiǎn)化 Kubernetes 的部署,深入解析其工作流程

    大家好,我是秋意零。 在前面 4 個(gè)章節(jié)中,我們充分了解了容器技術(shù)和 Kubernes 原生時(shí)代引擎的架構(gòu)和設(shè)計(jì)思想,今天分享的主要內(nèi)容是,探索 Kubernetes 部署,深入解析其工作流程 ?? 簡(jiǎn)介 ?? 個(gè)人主頁(yè) : 秋意零 ?? 個(gè)人介紹 :在校期間參與眾多云計(jì)算相關(guān)比賽,如:??

    2024年02月08日
    瀏覽(28)
  • 【SA8295P 源碼分析 (三)】97 - QNX AIS Camera 框架介紹 及 Camera 工作流程分析

    因?yàn)橐恍┰?,本文需要移除?對(duì)于已經(jīng)購(gòu)買的兄弟,不用擔(dān)心,不是跑路, 我會(huì)繼續(xù)持續(xù)提供技術(shù)支持, 有什么模塊想學(xué)習(xí)的,或者有什么問(wèn)題有疑問(wèn)的, 請(qǐng)私聊我,我們 +VX 溝通技術(shù)問(wèn)題,一起學(xué)習(xí),一起進(jìn)步 接下來(lái),我一一私聊已經(jīng)購(gòu)買的兄弟添加VX,我們繼續(xù)一起

    2024年02月07日
    瀏覽(25)
  • React16源碼: React中的completeWork對(duì)HostComponent處理的源碼實(shí)現(xiàn)

    HostComponent 1 )概述 在 completeWork 當(dāng)中,我們需要對(duì) HostComponent 的一些操作有哪些? 首先在一次更新而不是初次渲染的情況下 需要去 diffProperties 來(lái)計(jì)算,需要更新的內(nèi)容 也就是在 vdom 中去進(jìn)行一個(gè)對(duì)比來(lái)判斷這一個(gè)節(jié)點(diǎn)是否需要真的去更新它 以此來(lái)最低程度的去更新整個(gè) d

    2024年01月23日
    瀏覽(17)
  • React16源碼: React中的completeWork對(duì)HostText處理含更新的源碼實(shí)現(xiàn)

    HostText 1 )概述 在 completeWork 中 對(duì) HostText 的處理 在第一次掛載和后續(xù)更新的不同條件下進(jìn)行操作 第一次掛載主要是創(chuàng)建實(shí)例 后續(xù)更新其實(shí)也是重新創(chuàng)建實(shí)例 2 )源碼 定位到 packages/react-reconciler/src/ReactFiberCompleteWork.js#L663 到 case HostText 這里 進(jìn)入 updateHostText 進(jìn)入 createTextInst

    2024年01月24日
    瀏覽(22)
  • React源碼解析18(6)------ 實(shí)現(xiàn)useState

    React源碼解析18(6)------ 實(shí)現(xiàn)useState

    在上一篇文章中,我們已經(jīng)實(shí)現(xiàn)了函數(shù)組件。同時(shí)可以正常通過(guò)render進(jìn)行渲染。 而通過(guò)之前的文章,beginWork和completeWork也已經(jīng)有了基本的架子?,F(xiàn)在我們可以去實(shí)現(xiàn)useState了。 實(shí)現(xiàn)之前,我們要先修改一下我們的index.js文件: 由于我們這一篇并不會(huì)實(shí)現(xiàn)React的事件機(jī)制,所以

    2024年02月13日
    瀏覽(30)
  • React源碼解析18(1)------ React.createElement 和 jsx

    React源碼解析18(1)------ React.createElement 和 jsx

    我們知道在React17版本之前,我們?cè)陧?xiàng)目中是一定需要引入react的。 import React from “react” 即便我們有時(shí)候沒(méi)有使用到React,也需要引入。原因是什么呢? 在React項(xiàng)目中,如果我們使用了模板語(yǔ)法JSX,我們知道它要先經(jīng)過(guò)babel的轉(zhuǎn)譯。那babel會(huì)將JSX轉(zhuǎn)換成什么樣子的格式呢? 可

    2024年02月13日
    瀏覽(21)
  • TCP/IP協(xié)議工作原理與工作流程

    TCP/IP協(xié)議工作原理與工作流程

    使用OSI模型來(lái)描述一個(gè)網(wǎng)絡(luò)中的各個(gè)協(xié)議層,如下: TCP/IP協(xié)議,英文全稱Transmission Control Protocol/Internet Protocol,包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議,是Internet的核心協(xié)議。TCP/IP協(xié)議是一個(gè)協(xié)議簇,包含了應(yīng)用協(xié)議、傳輸協(xié)議、網(wǎng)際互聯(lián)協(xié)議和路由控制協(xié)議。如下圖: 應(yīng)

    2024年04月25日
    瀏覽(38)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包