一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - React - React嵌套組件的構建順序

React嵌套組件的構建順序

2022-02-27 17:16夏花未眠 React

這篇文章主要介紹了React嵌套組件的構建順序,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下

在React官網中,可以看到對生命周期的描述

React嵌套組件的構建順序

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

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

?
1
2
3
4
5
function Parent(){
  return (
    <div>child</div>
  )
}

對于上面的元素,React會調用React.createElement創建一個對象,這就是子元素的構建階段(這里使用的是babeljs.io/)

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

構建之后就是渲染、更新

接著看下嵌套組件

?
1
2
3
4
5
6
7
8
function Child() {
  return <div>child</div>
}
function Parent(){
  return (
   <Child>parent child</Child>
  )
}

React會調用React.createElement,并傳入以下參數

?
1
2
3
4
5
6
7
function Child() {
  return React.createElement("div", null, "child");
}
 
function Parent() {
  return React.createElement(Child, null, "parent child");
}

這里我們看出父子組件的構建過程,首先對當前組件進行構建,接著進入到組件中,繼續構建,遵循的原則是從上到下

接著看看傳入多個組件

?
1
2
3
4
5
6
7
8
9
10
11
function Child() {
  return <div>child組件</div>
}
function Parent(){
  return (
    <div>
     <div>div元素</div>
     <Child />
    </div>
  )
}

在React.createElement會傳入以下參數

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

可以進一步明確,子組件的構建和父組件是分離的,并且是在父組件構建之后創建的。所以父子組件的構建順序是父組件constructor,render子組件constructor,render

當子組件render完成后,會調用componentDidMount

構建總結

在多組件情況下,首先父元素constructor,進行初始化和開始掛載,接著調用render

對于DOM元素,會立即創建,對于React組件,會在之后進入到組件中,重復之前的constructor,構建,render,直到最后一個子元素

當最后一個子組件render完成后,會調用componentDidMount。也就是元素已經掛載完成。之后會層層向上,依次調用componentDidMount

偏離一點點主題

下面的代碼可以輔助理解上面的內容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// RenderChild的作用是,當接收到值時,渲染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嵌套組件的構建順序

因為第一種的構建參數是

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

第二種構建參數是

?
1
2
3
4
5
6
7
8
9
10
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
 }));

因為Child的構建是在RenderChild之后的,所以即使在Child中使用到了不存在的值,也不會報錯

最后總結

1. React組件的構建和開始掛載是從根元素到子元素的,因此數據流是從上到下的,掛載完成和狀態的更新是從子元素到根元素,此時可以將最新狀態傳給根元素

2. 組件和DOM元素的一個區別是,DOM元素會在當前位置創建,而React組件的構建渲染具有層級順序

以上就是React嵌套組件的構建順序的詳細內容,更多關于React嵌套組件的構建的資料請關注服務器之家其它相關文章!

原文鏈接:https://juejin.cn/post/6949372925732454437

延伸 · 閱讀

精彩推薦
  • ReactVite搭建React項目的方法步驟

    Vite搭建React項目的方法步驟

    這篇文章主要介紹了Vite搭建React項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面...

    Cookieboty5172022-02-24
  • ReactReact使用emotion寫css代碼

    React使用emotion寫css代碼

    這篇文章主要介紹了React如何使用emotion寫css代碼,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    joychenke8192022-02-25
  • React編寫簡潔React組件的小技巧

    編寫簡潔React組件的小技巧

    這篇文章主要介紹了編寫簡潔React組件的小技巧,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    KooFE前端團隊7572022-02-25
  • React不用一行代碼,搞懂React調度器原理

    不用一行代碼,搞懂React調度器原理

    本文會講解React調度器Scheduler的實現原理。知道你不喜歡看大段的代碼,所以本文沒有一行代碼。文末有Scheduler的源碼地址,感興趣的話可以去看看。...

    魔術師卡頌10562021-12-26
  • React詳解react setState

    詳解react setState

    這篇文章主要介紹了react setState的相關資料,幫助大家更好的理解和學習使用react,感興趣的朋友可以了解下...

    一個前端王4942022-02-27
  • ReactReactRouter的實現方法

    ReactRouter的實現方法

    這篇文章主要介紹了ReactRouter的實現,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    WindrunnerMax6202022-01-06
  • Reactreact hooks入門詳細教程

    react hooks入門詳細教程

    這篇文章主要介紹了react hooks入門詳細教程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考...

    抱素_6832022-02-23
  • React使用hooks寫React組件需要注意的5個地方

    使用hooks寫React組件需要注意的5個地方

    這篇文章主要介紹了使用hooks寫React組件需要注意的5個地方,幫助大家更好的理解和學習使用React組件,感興趣的朋友可以了解下...

    forrest醬8702022-02-24
主站蜘蛛池模板: 国产精品国产三级国产专区不 | 毛片免费观看的视频 | chinesespanking网站 | 欧美在线一二三区 | 天天综合天天影视色香欲俱全 | 大学生初次破苞免费视频 | 欧美精品黑人巨大在线播放 | 亚洲男人的天堂网站 | 成人免费一区二区三区在线观看 | caopren免费视频国产 | 国内精品久久久久久久久久久久 | 狠狠干在线观看 | 日本乱子 | 国产成人精品999在线 | 射西西| 毛片群| 国产欧美va欧美va香蕉在线观看 | 日本啊v在线观看 | 成人欧美一区二区三区黑人 | 日本免费观看的视频在线 | 国产精品成人一区二区1 | 亚洲AV无码专区国产乱码网站 | 国产精品永久免费视频观看 | 3x3x3x短视频在线看 | 日韩欧美中文字幕出 | 俄罗斯一级淫片bbbb | 四虎在线观看 | 肉文高h调教 | 波多野结衣被绝伦强在线观看 | 牛人国产偷窥女洗浴在线观看 | 国产专区一va亚洲v天堂 | 小早川怜子视频在线观看 | 亚洲乱码一二三四区国产 | 天码毛片一区二区三区入口 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 久久成人精品免费播放 | 国产一区二区三区免费在线视频 | 大陆性出航 | 国产99久久久国产精品成人 | 日本高清免费不卡在线播放 | 糖心vlog视频永久破解版 |