成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從 React 新官網學到的一個優秀實踐妙招

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

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

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

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

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 新官方文檔中,提出了一個更巧妙的方式來解決這個問題。

首先,我們可以將列表邏輯單獨拆分為一個子組件。該子組件接收參數 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 值。這樣,我們就能夠在不顯示監聽 type 變化的情況下,做到跟剛才一樣的效果。

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

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

在 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 是提前封裝好的列表組件,當我們在寫頁面頁面時,整個列表的開發工作量將會非常小。

完整代碼如下:

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 值,當 key 值發生變化,子組件會被重置。這樣的思路還可以運用到別的類似場景。

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

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

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

function BookProfile() {
  ...

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

總結

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

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

責任編輯:姜華 來源: 這波能反殺
相關推薦

2022-08-02 09:55:04

React前端

2023-03-30 08:00:00

ReactJavaScript前端

2020-06-01 09:40:06

開發ReactTypeScript

2022-08-19 09:01:59

ReactTS類型

2022-03-16 17:01:35

React18并發的React組件render

2015-08-24 11:03:14

android建項目

2015-07-28 11:02:15

androidapp開發

2015-06-01 06:42:50

開源公司三大教訓

2024-05-17 08:25:06

數據驅動React語言包

2022-03-21 10:21:50

jQuery代碼模式

2024-06-12 07:44:28

2020-09-16 14:39:13

ReactJavaScript框架

2024-06-19 08:45:13

2022-03-27 09:06:04

React類型定義前端

2023-11-29 07:29:28

ReactSolid

2013-07-01 11:01:22

API設計API

2009-05-20 09:49:15

2023-05-04 23:59:46

React開發工具

2019-09-02 13:57:07

Helm Chart工具Kubernetes

2022-02-28 15:56:14

零信任企業
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频一区在线观看 | 嫩草视频网 | 日本在线视 | 国产成人精品一区二区三区视频 | 美人の美乳で授乳プレイ | 在线黄av | 久久久久久成人 | 国产高潮av | 亚洲国产精品一区二区www | 亚洲精品在线播放 | www.中文字幕av | 国产精品毛片av | 亚洲国产精品一区二区久久 | 99热.com| 四虎影院免费在线播放 | 中文字幕av网站 | 久久久久久国产精品免费免费狐狸 | 四虎影视免费观看 | 91社区视频 | 九九精品在线 | 亚洲一区二区精品视频 | 精品综合视频 | 欧美亚洲国产一区二区三区 | 亚洲九九| 久久精品91久久久久久再现 | 亚洲欧美激情视频 | av在线电影网站 | av影音| 精品中文字幕久久 | 久久久久国产精品一区二区 | 日韩在线中文字幕 | 久久久久国产精品 | 欧美精品日韩精品 | 午夜视频在线 | 国产免费a | 成人国产一区二区三区精品麻豆 | 91www在线观看| 性色网站 | 国产免费观看久久黄av片涩av | 91精品国产一区二区三区香蕉 | 美女视频黄的免费 |