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

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

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
主站蜘蛛池模板: 四虎网址大全 | 免费的毛片视频 | 荡娃艳妇有声小说 | 色综合综合色 | 女人肮脏的交易中文字幕未删减版 | 男男gaygays18中国 | 久久re热在线视频精99 | 好爽好深好猛好舒服视频上 | 精品久久香蕉国产线看观看麻豆 | 亚洲欧美日韩精品 | 色交视频 | 无人视频在线观看完整版高清 | 欧美一区精品二区三区 | 三星w999 | 成人看的羞羞视频免费观看 | 青草视频在线观看视频 | 欧美yw193.c㎝在线观看 | 高中生放荡日记高h娜娜 | 国精视频一区二区视频 | 美女免费观看一区二区三区 | 四虎永久在线精品波多野结衣 | 99热热99 | 校花被吃奶还摸下面 | 亚洲性视频在线观看 | 日韩欧美国产一区 | 久久er国产免费精品 | 日女人免费视频 | 北条麻妃黑人正在播放 | 我和老丈洗澡同性 | 精品日韩欧美一区二区三区在线播放 | 国产老妇 | 国产亚洲精品第一综合linode | 国产拍拍拍免费专区在线观看 | gay台湾无套男同志可播放 | 亚洲精品久久7777777 | 精品国产一二三区在线影院 | 国产3344视频在线观看免费 | 亚洲国产一区二区三区青草影视 | 高清一级做a爱免费视 | 污到湿的爽文免费阅读 | 午夜福利自怕 |