最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React嵌套組件的構(gòu)建順序

 更新時(shí)間:2021年04月10日 14:56:09   作者:夏花未眠  
這篇文章主要介紹了React嵌套組件的構(gòu)建順序,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下

在React官網(wǎng)中,可以看到對(duì)生命周期的描述

這里有一個(gè)疑問是,在嵌套組件中,是父組件先構(gòu)建,還是子組件先構(gòu)建?是子組件先更新,還是父組件先更新

解決這個(gè)問題,可以從嵌套單個(gè)元素入手。下面是一個(gè)只有DOM元素的組件 Parent

function Parent(){
  return (
    <div>child</div>
  )
}

對(duì)于上面的元素,React會(huì)調(diào)用React.createElement創(chuàng)建一個(gè)對(duì)象,這就是子元素的構(gòu)建階段(這里使用的是babeljs.io/)

React.createElement("div", null, "child")

構(gòu)建之后就是渲染、更新

接著看下嵌套組件

function Child() {
  return <div>child</div>
}
function Parent(){
  return (
   <Child>parent child</Child>
  )
}

React會(huì)調(diào)用React.createElement,并傳入以下參數(shù)

function Child() {
  return React.createElement("div", null, "child");
}

function Parent() {
  return React.createElement(Child, null, "parent child");
}

這里我們看出父子組件的構(gòu)建過程,首先對(duì)當(dāng)前組件進(jìn)行構(gòu)建,接著進(jìn)入到組件中,繼續(xù)構(gòu)建,遵循的原則是從上到下

接著看看傳入多個(gè)組件

function Child() {
  return <div>child組件</div>
}
function Parent(){
  return (
    <div>
     <div>div元素</div>
     <Child />
    </div>
  )
}

在React.createElement會(huì)傳入以下參數(shù)

React.createElement("div", null, React.createElement("div", null, "div\u5143\u7D20"),React.createElement(Child, null))
React.createElement("div", null, "child\u7EC4\u4EF6")

可以進(jìn)一步明確,子組件的構(gòu)建和父組件是分離的,并且是在父組件構(gòu)建之后創(chuàng)建的。所以父子組件的構(gòu)建順序是父組件constructor,render子組件constructor,render

當(dāng)子組件render完成后,會(huì)調(diào)用componentDidMount

構(gòu)建總結(jié)

在多組件情況下,首先父元素constructor,進(jìn)行初始化和開始掛載,接著調(diào)用render

對(duì)于DOM元素,會(huì)立即創(chuàng)建,對(duì)于React組件,會(huì)在之后進(jìn)入到組件中,重復(fù)之前的constructor,構(gòu)建,render,直到最后一個(gè)子元素

當(dāng)最后一個(gè)子組件render完成后,會(huì)調(diào)用componentDidMount。也就是元素已經(jīng)掛載完成。之后會(huì)層層向上,依次調(diào)用componentDidMount

偏離一點(diǎn)點(diǎn)主題

下面的代碼可以輔助理解上面的內(nèi)容

// RenderChild的作用是,當(dāng)接收到值時(shí),渲染children,沒有值時(shí),渲染其他元素

function RenderChild(props){
  return (
    props.a ? props.children : <div>aaaa</div>
  )
}

寫法一(直接渲染DOM元素):
function Parent(){
  let a = undefined;
  setTimeout(() => {
    a = { b: 1 };
  });
  return (
    <RenderChild val={a}>
      <div>{a.b}</div>
    </RenderChild>
  )
}

寫法二(渲染組件):
function Child(props) {
  return <div>{props.a.b}</div>
}

function Parent(){
  const a = undefined;
  setTimeout(() => {
    a = { b: 1 };
  });
  return (
    <RenderChild val={a}>
      <Child childVal={a} />
    </RenderChild>
  )
}

在上面兩種寫法中,第一種一定會(huì)報(bào)錯(cuò)

因?yàn)榈谝环N的構(gòu)建參數(shù)是

React.createElement(RenderChild, { val: a },React.createElement("div", null, a.b))
此時(shí)a還是undefined

第二種構(gòu)建參數(shù)是

function RenderChild(props) {
  return props.val ? props.children : React.createElement("div", null, "aaaa");
}

function Child(props) {
  return React.createElement("div", null, props.value.b);
}
React.createElement(RenderChild, { val: a }, React.createElement(Child, {
    value: a
 }));

因?yàn)镃hild的構(gòu)建是在RenderChild之后的,所以即使在Child中使用到了不存在的值,也不會(huì)報(bào)錯(cuò)

最后總結(jié)

1. React組件的構(gòu)建和開始掛載是從根元素到子元素的,因此數(shù)據(jù)流是從上到下的,掛載完成和狀態(tài)的更新是從子元素到根元素,此時(shí)可以將最新狀態(tài)傳給根元素

2. 組件和DOM元素的一個(gè)區(qū)別是,DOM元素會(huì)在當(dāng)前位置創(chuàng)建,而React組件的構(gòu)建渲染具有層級(jí)順序

以上就是React嵌套組件的構(gòu)建順序的詳細(xì)內(nèi)容,更多關(guān)于React嵌套組件的構(gòu)建的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于react 父子組件的執(zhí)行順序

    關(guān)于react 父子組件的執(zhí)行順序

    這篇文章主要介紹了關(guān)于react 父子組件的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React組件封裝中三大核心屬性詳細(xì)介紹

    React組件封裝中三大核心屬性詳細(xì)介紹

    這篇文章主要為大家介紹了React組件實(shí)例三大屬性state props refs使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • React-Router如何進(jìn)行頁面權(quán)限管理的方法

    React-Router如何進(jìn)行頁面權(quán)限管理的方法

    本篇文章主要介紹了React-Router如何進(jìn)行頁面權(quán)限管理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • react基于react-slick實(shí)現(xiàn)多圖輪播效果

    react基于react-slick實(shí)現(xiàn)多圖輪播效果

    React slick是一個(gè)使用React構(gòu)建的輪播組件,下面這篇文章主要給大家介紹了關(guān)于react基于react-slick實(shí)現(xiàn)多圖輪播效果的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 通過React-Native實(shí)現(xiàn)自定義橫向滑動(dòng)進(jìn)度條的 ScrollView組件

    通過React-Native實(shí)現(xiàn)自定義橫向滑動(dòng)進(jìn)度條的 ScrollView組件

    開發(fā)一個(gè)首頁擺放菜單入口的ScrollView可滑動(dòng)組件,允許自定義橫向滑動(dòng)進(jìn)度條,且內(nèi)部渲染的菜單內(nèi)容支持自定義展示的行數(shù)和列數(shù),在內(nèi)容超出屏幕后,渲染順序?yàn)榭v向由上至下依次排列,對(duì)React Native橫向滑動(dòng)進(jìn)度條相關(guān)知識(shí)感興趣的朋友一起看看吧
    2024-02-02
  • 詳解開發(fā)react應(yīng)用最好用的腳手架 create-react-app

    詳解開發(fā)react應(yīng)用最好用的腳手架 create-react-app

    本篇文章主要介紹了詳解開發(fā)react應(yīng)用最好用的腳手架 create-react-app,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • React Native中實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)入的示例代碼

    React Native中實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)入的示例代碼

    隨著業(yè)務(wù)的發(fā)展,每一個(gè) React Native 應(yīng)用的代碼數(shù)量都在不斷增加。作為一個(gè)前端想到的方案自然就是動(dòng)態(tài)導(dǎo)入(Dynamic import)了,本文介紹了React Native中實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)入的示例代碼,需要的可以參考一下
    2022-06-06
  • react 中父組件與子組件雙向綁定問題

    react 中父組件與子組件雙向綁定問題

    這篇文章主要介紹了react 中父組件與子組件雙向綁定問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • React中的受控組件與非受控組件詳解

    React中的受控組件與非受控組件詳解

    在React中,受控組件指的是表單元素的value值受React組件的state或props控制的組件,而非受控組件則是表單元素的value值由DOM自身負(fù)責(zé)管理的組件,本文將給大家詳細(xì)介紹React受控組件與非受控組件,需要的朋友可以參考下
    2023-08-08
  • react如何將字符串轉(zhuǎn)義成html語句

    react如何將字符串轉(zhuǎn)義成html語句

    這篇文章主要介紹了react如何將字符串轉(zhuǎn)義成html語句問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論

麟游县| 红桥区| 荣昌县| 阿合奇县| 永安市| 桑植县| 嘉兴市| 韶山市| 大英县| 东乌珠穆沁旗| 西畴县| 阳新县| 安乡县| 嘉黎县| 防城港市| 永新县| 昌平区| 白银市| 库尔勒市| 翼城县| 缙云县| 濮阳县| 大新县| 赤壁市| 广汉市| 修武县| 津南区| 汾阳市| 田阳县| 伊川县| 高尔夫| 张家界市| 呈贡县| 鄂伦春自治旗| 通化市| 白河县| 女性| 佛坪县| 龙南县| 阳泉市| 措勤县|