React嵌套組件的構(gòu)建順序
在React官網(wǎng)中,可以看到對(duì)生命周期的描述

這里有一個(gè)疑問(wèn)是,在嵌套組件中,是父組件先構(gòu)建,還是子組件先構(gòu)建?是子組件先更新,還是父組件先更新
解決這個(gè)問(wèn)題,可以從嵌套單個(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)建過(guò)程,首先對(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)行初始化和開(kāi)始掛載,接著調(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,沒(méi)有值時(shí),渲染其他元素
function RenderChild(props){
return (
props.a ? props.children : <div>aaaa</div>
)
}
寫(xiě)法一(直接渲染DOM元素):
function Parent(){
let a = undefined;
setTimeout(() => {
a = { b: 1 };
});
return (
<RenderChild val={a}>
<div>{a.b}</div>
</RenderChild>
)
}
寫(xiě)法二(渲染組件):
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>
)
}
在上面兩種寫(xiě)法中,第一種一定會(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)建和開(kāi)始掛載是從根元素到子元素的,因此數(shù)據(jù)流是從上到下的,掛載完成和狀態(tài)的更新是從子元素到根元素,此時(shí)可以將最新?tīng)顟B(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)建的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React-Router如何進(jìn)行頁(yè)面權(quán)限管理的方法
本篇文章主要介紹了React-Router如何進(jìn)行頁(yè)面權(quán)限管理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
react基于react-slick實(shí)現(xiàn)多圖輪播效果
React slick是一個(gè)使用React構(gòu)建的輪播組件,下面這篇文章主要給大家介紹了關(guān)于react基于react-slick實(shí)現(xiàn)多圖輪播效果的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
通過(guò)React-Native實(shí)現(xiàn)自定義橫向滑動(dòng)進(jìn)度條的 ScrollView組件
開(kāi)發(fā)一個(gè)首頁(yè)擺放菜單入口的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
詳解開(kāi)發(fā)react應(yīng)用最好用的腳手架 create-react-app
本篇文章主要介紹了詳解開(kāi)發(fā)react應(yīng)用最好用的腳手架 create-react-app,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
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如何將字符串轉(zhuǎn)義成html語(yǔ)句
這篇文章主要介紹了react如何將字符串轉(zhuǎn)義成html語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

