溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

React中嵌套組件的構(gòu)建順序是什么

發(fā)布時間:2021-04-12 15:40:34 來源:億速云 閱讀:374 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)React中嵌套組件的構(gòu)建順序是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

React中嵌套組件的構(gòu)建順序是什么

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

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

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

對于上面的元素,React會調(diào)用React.createElement創(chuàng)建一個對象,這就是子元素的構(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會調(diào)用React.createElement,并傳入以下參數(shù)

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

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

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

接著看看傳入多個組件

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

在React.createElement會傳入以下參數(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完成后,會調(diào)用componentDidMount

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

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

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

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

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

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

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

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>
  )
}

在上面兩種寫法中,第一種一定會報錯

React中嵌套組件的構(gòu)建順序是什么

因為第一種的構(gòu)建參數(shù)是

React.createElement(RenderChild, { val: a },React.createElement("div", null, a.b))
此時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
 }));

關(guān)于React中嵌套組件的構(gòu)建順序是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI