<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          《react 實戰(zhàn)系列》children 透傳

          共 3136字,需瀏覽 7分鐘

           ·

          2021-09-25 18:23

          問題

          react 三層組件,也就是常說的爺孫組件,怎么通信?

          方案一,props 直接傳


          我稱之為暴力寫法(因為這種方式,其實不管嵌套多少層,都可以這樣寫,很暴力),直接看代碼。

          function Top () {
            const [middleData] = useState(1);
            const [bottomData] = useState(2);
            
            return <Middle middleData={middleData} bottomData={bottomData}  />
          }

          function Middle ({ middleData, bottomData }) {
            return (
              <>
                {middleData}
                <Bottom bottomData={bottomData} />
              </>
            )
          }

          function Bottom ({ bottomData }) {
            return <>{bottomData}</>
          }

          Bottom 組件通過 Middle 組件中轉(zhuǎn),成功拿到了 Top 組件的值。那這樣有什么問題呢?

          這樣寫,如果 Top 組件需要傳遞其它數(shù)據(jù)給到 Bottom,就意味著 Middle 組件需要加字段。

          方案一改進版


          我們把所有需要從 Top 傳遞給 Bottom 的封裝為一個字段,比如叫 allBottomProps。

          function Top () {
            const [middleData] = useState(1);
            const [bottomData] = useState(2);
            
            return <Middle middleData={middleData} allBottomProps={{ bottomData: bottomData }}  />
          }

          function Middle ({ middleData, allBottomProps }) {
            return (
              <>
                {middleData}
                <Bottom {...allBottomProps} />
              </>
            )
          }

          function Bottom ({ bottomData }) {
            return <>{bottomData}</>
          }

          這樣改進之后,Top 組件需要給 Bottom 傳遞其它數(shù)據(jù)時,就不需要去動 Middle 的代碼了。那這樣還有什么問題嗎?能不能把 Middle 這層抹平,不然即使封裝在一個字段,還是逃脫不了 Middle 的魔爪。我想直接測試 Middle 時,還得造一份 Bottom 組件的數(shù)據(jù)。

          方案二,通過 children 透傳

          先看代碼(類似于 vue 中的 slot),再來分析

          function Top () {
            const [middleData] = useState(1);
            const [bottomData] = useState(2);
            
            return (
              <>
                <Middle middleData={middleData}>
                  <Bottom bottomData={bottomData} />
                </Middle>
              </>
            )
          }

          function Middle ({ middleData, children }) {
            return (
              <>
                {middleData}
                {children}
              </>
            )
          }

          function Bottom ({ bottomData }) {
            return <>{bottomData}</>
          }

          利用 children 處理之后,優(yōu)點比較明顯:

          • Middle 組件變得更加的獨立,跟 Bottom 不再耦合
          • 直接在 Top 組件就可以進行數(shù)據(jù)的分發(fā)
          • 直接在 Top 組件就可以看清楚組件的結(jié)構(gòu),很清晰

          小結(jié)

          業(yè)務(wù)代碼,并且嵌套的層級不算深,可以試試 children 透傳。結(jié)構(gòu)簡單、清晰。

          下期預告

          十一將至,相信很多小伙伴都要騎上心愛的小摩托出去旅游。作為一個土生土長的重慶人,決定簡短寫一篇攻略(主要是吃),讓去重慶的小伙伴不踩雷,吃到正宗的美食。

          像很多網(wǎng)紅點都是不推薦去吃的,商業(yè)化太嚴重,已經(jīng)變得不純粹了。具體下篇細說咯~~~


          瀏覽 124
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠躁日日躁夜夜躁A片视频小说 | 在线免费看黄片网站 | 91.xxxxx | 99精品一区二区 | 韩国黄色三集片 |