日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-04-15 18:11:54 207觀看
導讀在開發過程中,我們常常會遇到這樣的場景。有一個列表,但是我們需要根據列表的不同類型查詢并顯示對應類型的數據。如頭圖所示。這里有一個很明確的現象就是,不同的類型會對應不同的列表,但是當我們代入抽象思維思考一下就

8c128資訊網——每日最新資訊28at.com

在開發過程中,我們常常會遇到這樣的場景。8c128資訊網——每日最新資訊28at.com

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

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

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>        )}      />    </>  )}

這樣的處理是有一定合理性的,我相信很多小伙伴也會這樣處理。因為他非常符合語義。8c128資訊網——每日最新資訊28at.com

不過 React 新官方文檔中,提出了一個更巧妙的方式來解決這個問題。8c128資訊網——每日最新資訊28at.com

首先,我們可以將列表邏輯單獨拆分為一個子組件。該子組件接收參數 type 作為一個 props8c128資訊網——每日最新資訊28at.com

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 變化的情況下,做到跟剛才一樣的效果。8c128資訊網——每日最新資訊28at.com

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

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

在 ListPart 的封裝中,我們還可以借助我們之前封裝自定義 hook 的思路,進一步簡化代碼。8c128資訊網——每日最新資訊28at.com

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 是提前封裝好的列表組件,當我們在寫頁面頁面時,整個列表的開發工作量將會非常小。8c128資訊網——每日最新資訊28at.com

完整代碼如下:8c128資訊網——每日最新資訊28at.com

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 值發生變化,子組件會被重置。這樣的思路還可以運用到別的類似場景。8c128資訊網——每日最新資訊28at.com

例如,你請求了一個書籍列表,但是某一個區域只能顯示選中的書籍的部分信息與幾條用戶評價,當我們選中別的書籍時,這信息與評論都需要全部更新。8c128資訊網——每日最新資訊28at.com

這里處理起來比較麻煩的是書籍部分信息是從父級傳遞而來,而評論信息卻是需要重新請求獲取。8c128資訊網——每日最新資訊28at.com

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

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

總結

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

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

本文鏈接:http://www.www897cc.com/showinfo-26-83618-0.html從 React 新官網學到的一個優秀實踐妙招

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++中的顯式虛函數重載:override與final詳解

下一篇: 要么返回錯誤值,要么輸出日志,別兩樣都做

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 支持aptX Lossless無損傳輸 iQOO TWS 1賽道版發布限時優惠價369元

    2023年7月4日,“無損音質,聲動人心”iQOO TWS 1正式發布,支持aptX Lossless無損傳輸,限時優惠價369元。iQOO TWS 1耳機率先支持端到端aptX Lossless無
Top 主站蜘蛛池模板: 滨海县| 宁波市| 南安市| 桃园市| 左贡县| 湖北省| 茂名市| 镇沅| 洪洞县| 卓尼县| 弥渡县| 东明县| 成都市| 武威市| 兴国县| 乐昌市| 个旧市| 西吉县| 玉溪市| 华亭县| 威信县| 乐安县| 丹江口市| 邹城市| 察隅县| 中江县| 南通市| 商都县| 平利县| 都匀市| 弋阳县| 石景山区| 澎湖县| 济南市| 集贤县| 泸定县| 滨州市| 温宿县| 杭锦旗| 汶上县| 巩义市|