自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從 React 新官網(wǎng)學(xué)到的一個優(yōu)秀實踐妙招

開發(fā) 前端
React 新的官方文檔確實寫得非常好,提供了許多項目開發(fā)最佳實踐的思路。這些思路和實用技巧,同樣也適用于 Vue,也能夠提高我們對 Vue 的使用心得。

在開發(fā)過程中,我們常常會遇到這樣的場景。

有一個列表,但是我們需要根據(jù)列表的不同類型查詢并顯示對應(yīng)類型的數(shù)據(jù)。如頭圖所示。這里有一個很明確的現(xiàn)象就是,不同的類型會對應(yīng)不同的列表,但是當(dāng)我們代入抽象思維思考一下就能輕易發(fā)現(xiàn),除了類型不同之外,其他的所有特性都是一樣的。

一樣的接口、一樣的 UI、一樣的類型、一樣的交互。因此我們很容易會想到,把多個類型的列表當(dāng)成同一個列表來處理,當(dāng) type 發(fā)生變化時去重新請求接口就可以輕松完成這個功能。

function ListPage() {
  const [list, setList] = useState([])
  const [loading, setLoading] = useState(true)
  const [error, setError] = useState('')

  const [type, setType] = useState('all')

  useEffect(() => {
    setLoading(true)
    api.get('xxx/xxx/xxx', type).then(res => {
      setList(res.data)
      setLoading(false)
      setError('')
    })
  }, [type])

  return (
    <>
      <Tabs type={type} onChange={setType} />
      <List
        list={list}
        loading={loading}
        error={error}
        renderItem={(item) => (
          <div key={item} className={s.item}>{item}</div>
        )}
      />
    </>
  )
}

這樣的處理是有一定合理性的,我相信很多小伙伴也會這樣處理。因為他非常符合語義。

不過 React 新官方文檔中,提出了一個更巧妙的方式來解決這個問題。

首先,我們可以將列表邏輯單獨拆分為一個子組件。該子組件接收參數(shù) type 作為一個 props

function ListPart({type}) {
  const [list, setList] = useState([])
  const [loading, setLoading] = useState(true)
  const [error, setError] = useState('')

  useEffect(() => {
    api.get('xxx/xxx/xxx', type).then(res => {
      setList(res.data)
      setLoading(false)
      setError('')
    })
  }, [])
  
  return (
    <List
      list={list}
      loading={loading}
      error={error}
      renderItem={(item) => (
        <div key={item} className={s.item}>{item}</div>
      )}
    />
  )
}

然后這里的重點來了,在 ListPage 組件中,我們在剛才封裝好的子組件 ListPart 上,傳入一個 key 值。這樣,我們就能夠在不顯示監(jiān)聽 type 變化的情況下,做到跟剛才一樣的效果。

function ListPage() {
  const [type, setType] = useState('all')
  return (
    <div>
      <Tabs type={type} onChange={setType} />
      <ListPart type={type} key={type} />
    </div>
  )
}

在 React 的 diff 過程中,當(dāng)一個組件的 key 值發(fā)生了變化,那么該組件將會被重新創(chuàng)建。我們也正是巧妙的利用了這個內(nèi)部邏輯,將代碼改進成現(xiàn)在這樣。

在 ListPart 的封裝中,我們還可以借助我們之前封裝自定義 hook 的思路,進一步簡化代碼。

function ListPart({type}) {
  const { loading, list = [], error } = useFetch(api, type)
  
  return (
    <List
      list={list}
      loading={loading}
      error={error}
      renderItem={(item) => (
        <div key={item} className={s.item}>{item}</div>
      )}
    />
  )
}

這里面由于自定義 hook useFetch 是提前封裝好的工具方法,List 是提前封裝好的列表組件,當(dāng)我們在寫頁面頁面時,整個列表的開發(fā)工作量將會非常小。

完整代碼如下:

function ListPage() {
  const [type, setType] = useState('all')

  return (
    <div>
      <Tabs type={type} onChange={setType} />
      <ListPart type={type} key={type} />
    </div>
  )
}
function ListPart({type}) {
  const { loading, list = [], error } = useFetch(api, type)
  
  return (
    <List
      list={list}
      loading={loading}
      error={error}
      renderItem={(item) => (
        <div key={item} className={s.item}>{item}</div>
      )}
    />
  )
}

其他案例

給子組件傳入 key 值,當(dāng) key 值發(fā)生變化,子組件會被重置。這樣的思路還可以運用到別的類似場景。

例如,你請求了一個書籍列表,但是某一個區(qū)域只能顯示選中的書籍的部分信息與幾條用戶評價,當(dāng)我們選中別的書籍時,這信息與評論都需要全部更新。

這里處理起來比較麻煩的是書籍部分信息是從父級傳遞而來,而評論信息卻是需要重新請求獲取。

不過借助這個思路,將會非常容易做到良好的解耦,我們只需要從父級通過 props 把書籍信息傳遞下來,然后在子組件內(nèi)部自己去處理評論信息即可。從而斷開評論信息與書籍切換的耦合。

function BookProfile() {
  ...

  return (
    <div>
      ...
      <CurrentBookPart info={infolist[i]} key={bookid} />
    </div>
  )
}
function CurrentBookPart(props) {
  const [comment, setComment] = useState()
  ...
}

總結(jié)

合理運用這個技巧,可以讓我們的代碼更加高效、低耦合,邏輯更加順暢。也能夠大幅度提高我們的開發(fā)效率,快快去重新查看一下你的項目,有沒有可以使用這種方式重構(gòu)的地方吧。

React 新的官方文檔確實寫得非常好,提供了許多項目開發(fā)最佳實踐的思路。這些思路和實用技巧,同樣也適用于 Vue,也能夠提高我們對 Vue 的使用心得。

責(zé)任編輯:姜華 來源: 這波能反殺
相關(guān)推薦

2022-08-02 09:55:04

React前端

2023-03-30 08:00:00

ReactJavaScript前端

2022-03-16 17:01:35

React18并發(fā)的React組件render

2015-06-01 06:42:50

開源公司三大教訓(xùn)

2020-06-01 09:40:06

開發(fā)ReactTypeScript

2022-08-19 09:01:59

ReactTS類型

2015-08-24 11:03:14

android建項目

2015-07-28 11:02:15

androidapp開發(fā)

2022-03-21 10:21:50

jQuery代碼模式

2024-05-17 08:25:06

數(shù)據(jù)驅(qū)動React語言包

2024-06-12 07:44:28

2024-06-19 08:45:13

2022-03-27 09:06:04

React類型定義前端

2020-09-16 14:39:13

ReactJavaScript框架

2023-11-29 07:29:28

ReactSolid

2019-09-02 13:57:07

Helm Chart工具Kubernetes

2013-07-01 11:01:22

API設(shè)計API

2023-03-19 11:42:19

React新官方文檔

2023-05-04 23:59:46

React開發(fā)工具

2009-05-20 09:49:15

點贊
收藏

51CTO技術(shù)棧公眾號