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

簡化React Hook的5種方法

開發 前端
在編寫自定義Hook時,很容易產生過于復雜的解決方案。這有時會導致不穩定的行為,創建無用的重新渲染,或者只是使其更難維護。考慮到這一點,我想分享5種我發現的幫助簡化定制Hook的方法。

在編寫自定義Hook時,很容易產生過于復雜的解決方案。這有時會導致不穩定的行為,創建無用的重新渲染,或者只是使其更難維護。考慮到這一點,我想分享5種我發現的幫助簡化定制Hook的方法。

簡化React Hook的5種方法

1. 減少 useState 數量

當你使用hook進行開發時,很容易使用過多的 useState 調用,或者將所有的狀態縮減為單一的、過于復雜的 useState。提高hook的可讀性的最好方法之一就是優先考慮你的 useState 調用。我喜歡在我寫的鉤子中遵循一些關于狀態實現的規則。

(1) 優先考慮易讀性

我更喜歡將狀態讀取為對象,而不是使用多個具有簡單值的 useState 命令。使用更少的 useState 命令也會讓你的鉤子的返回更容易,并且在組件中的實現更直接。雖然這是我的偏好,但代碼是一個非常個人化的東西,也是非常有表現力的。我寫代碼時的第一條規則是優先考慮可讀性,遵循這個規則會讓你的代碼更容易維護,迫使你去思考你所寫的東西,并讓別人更容易遵循你的代碼。如果這是你從這個文章中帶走的唯一東西,那么我已經完成了我的工作。

(2) 評估狀態對象的內容

組件從一開始就沒有被完美地規劃過,隨著組件的增長,你的 useState 中包含的屬性可能也會變得越來越復雜。在整個開發周期中,我強烈建議評估你的 useState 調用的內容,以確定將狀態部分分成其他 useState 調用是否有意義。你可能想按功能或類型對狀態值進行分組。一般來說,我喜歡把狀態數據按照我認為通常會一起更新的屬性來分組,或者按照狀態屬性的功能來分組,比如數據和視圖屬性。

2. 利用你的Hook返回

當我剛開始寫自定義Hook時,很容易遵循類似于默認的 useState 鉤子的返回樣式。雖然這并不是壞事,但在函數之上使用一個返回數組來返回多個狀態變量,會很麻煩。想象一下,除了處理數據選擇的函數外,還可以返回2個不同的狀態變量(1個是數據狀態,1個是視圖狀態)的鉤子,用數組風格的返回方式編寫,它可能看起來像這樣。

  1. function useBasicHook() { 
  2.   const [dataState, setDataState] = useState({ 
  3.     serverData: {}, 
  4.     selections: {} 
  5.   }); 
  6.   const [viewState, setViewState] = useState({ 
  7.     menuExpanded: false, 
  8.     submitFormData: {} 
  9.   }) 
  10.    
  11.   const toggleMenuExpand = () => { 
  12.     setViewState({ 
  13.       menuExpanded: !viewState.menuExpanded, 
  14.       submitFormData: viewState.submitFormData 
  15.     }) 
  16.   } 
  17.    
  18.   return [dataState, viewState, toggleMenuExpande]; 
  19.  
  20. function BasicComponent(){ 
  21.   const [dataState, viewState, toggleMenuExpand] = useBasicHook(); 
  22.    
  23.   return <div> 
  24.     </div> 

看看這個hook,很容易看出,如果在返回中添加額外的函數或變量,hook的實現會很快失控。如果你不小心破壞了數組的順序,或者用不正確的名稱,會造成額外的混亂和可能的錯誤。我們可以通過更新hook返回一個對象來防止這種情況的發生,就像這樣。

  1. function useBasicHook() { 
  2.   const [dataState, setDataState] = useState({ 
  3.     serverData: {}, 
  4.     selections: {} 
  5.   }); 
  6.   const [viewState, setViewState] = useState({ 
  7.     menuExpanded: false, 
  8.     submitFormData: {} 
  9.   }) 
  10.    
  11.   const toggleMenuExpand = () => { 
  12.     setViewState({ 
  13.       menuExpanded: !viewState.menuExpanded, 
  14.       submitFormData: viewState.submitFormData 
  15.     }) 
  16.   } 
  17.    
  18.   return { 
  19.     dataState: dataState, 
  20.     viewState: viewState, 
  21.     toggleMenuExpand: toggleMenuExpand 
  22.   }; 
  23.  
  24. function BasicComponent(){ 
  25.   const state = useBasicHook(); 
  26.   // or 
  27.   // const {dataState, viewState, toggleMenuExpand} = useBasicHook(); 
  28.    
  29.   return <div> 
  30.     </div> 

將返回值轉換為對象還有其他好處,包括:

  • 如果hook在多個組件之間共享或作為庫共享,則在更新后提高hook版本的兼容性;
  • 在使用Hook在組件頂部提供相同級別的Hook API時,仍然可以解構對象。

還有一件很酷的事情,你可以用你的鉤子返回,就是在你的狀態中創建基于組件工廠函數的小狀態。這提供了一種很好的方式,可以將組件構建器共享給實現鉤子的組件,而無需將狀態公開給該組件。

3. 使用合并鉤子簡化 setState 調用

在React中使用類而不是基于函數的組件進行開發,當涉及到狀態管理時,確實有一些開箱即用的優勢,對我來說,最主要的是舊狀態與新狀態的合并。React Docs for State提供了React.Component中內置的狀態合并功能的良好示例。雖然該功能沒有直接內置到鉤子中,但我們可以通過一個簡單的自定義鉤子來復制這種行為,它可以替換我們的 useState 調用,給我們同樣的行為。

  1. function useMergeState(initialState) { 
  2.   const [state, setState] = useState(initialState); 
  3.   // 使用 useRef 來改進異步調用 setState 時的功能。 
  4.   const stateRef = useRef(state); 
  5.  
  6.   function setRefState(newState) { 
  7.       stateRef.current = newState
  8.       return setState(newState); 
  9.   } 
  10.  
  11.   function mergeState(newState) { 
  12.     var finalState = newState
  13.     /** 
  14.      * 判斷狀態數據類型是否匹配,如果匹配,則繼續合并, 
  15.      * 如果不匹配,則拋出一個控制臺警告,用新的狀態覆蓋。 
  16.      */ 
  17.     if (typeof stateRef.current !== typeof newState) { 
  18.       console.warn( 
  19.         "useMergeState warning: 狀態數據類型不匹配,用新的狀態覆蓋狀態。" 
  20.       ); 
  21.       finalState = newState
  22.     } else { 
  23.       /** 
  24.        * 在此處理合并 
  25.        */ 
  26.       if (typeof stateRef.current == "object" && !Array.isArray(stateRef.current)) { 
  27.         // 現有狀態是一個對象,繼續嘗試合并 
  28.         if (typeof newState == "object" && !Array.isArray(newState)) { 
  29.           finalState = { ...stateRef.current, ...newState }; 
  30.         } 
  31.       } 
  32.     } 
  33.  
  34.     return setRefState(finalState); 
  35.   } 
  36.  
  37.   return [stateRef.current, mergeState]; 

4. 考慮拆分Hook

無論組件的復雜程度如何,我總是建議使用自定義鉤子;然而,在構建自定義鉤子時,將一個過于復雜的鉤子分割成多個較簡單的鉤子是非常有用的。在我的項目中,我喜歡根據功能來拆分鉤子邏輯,比如說,把一個鉤子拆成邏輯上的狀態子集,比如數據/Web API交互的鉤子和顯示狀態的單獨的鉤子,可能會有好處。回想一下鉤子返回部分的例子鉤子,這樣拆開來可能會有幫助。

  1. function useDataHook() { 
  2.   const [dataState, setDataState] = useState({ 
  3.     serverData: {}, 
  4.     selections: {} 
  5.   }); 
  6.    
  7.   return dataState; 
  8.  
  9. function useDisplayHook() { 
  10.   const [viewState, setViewState] = useState({ 
  11.     menuExpanded: false, 
  12.     submitFormData: {} 
  13.   }) 
  14.    
  15.   const toggleMenuExpand = () => { 
  16.     setViewState({ 
  17.       menuExpanded: !viewState.menuExpanded, 
  18.       submitFormData: viewState.submitFormData 
  19.     }) 
  20.   } 
  21.    
  22.   return { 
  23.     viewState: viewState, 
  24.     toggleMenuExpand: toggleMenuExpand 
  25.  
  26. function BasicComponent(){ 
  27.   const data = useDataHook(); 
  28.   const display = useDisplayHook(); 
  29.    
  30.   return <div> 
  31.     </div> 

拆分后的示例掛鉤

[[328037]]

5. 評估 useEffect 調用,以防止不必要的重新渲染

useEffect鉤子非常有用,但是如果使用不當,可能會導致過度渲染。查看自定義鉤子時,值得評估你的useEffect調用。我喜歡遵守以下經驗法則:

如果一個 useEffect 在同一個鉤子作用域中監聽狀態變量,那么這個效果不應該更新狀態本身。

如果你有多個useEffect語句在偵聽同一組變量,請考慮將它們組合在一起。

盡管結合使用 useEffects 有助于減少重新渲染次數,但首先要優先考慮代碼的可讀性。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2020-09-01 09:56:26

云端云計算云服務

2020-05-26 11:39:05

WebReact組件

2016-06-28 10:19:31

云計算云安全

2024-11-04 12:38:52

2020-07-24 09:56:12

React開發數據

2022-08-01 07:56:23

React Hook開發組件

2021-02-25 10:46:21

云計算云服務器云安全

2019-08-22 07:24:25

2022-05-24 14:37:49

React條件渲染

2023-06-08 09:00:00

2020-01-16 18:33:24

安全數據網絡

2020-07-06 14:00:01

Pandas連接參數

2020-03-23 09:27:10

物聯網安全物聯網IOT

2018-11-01 10:10:35

網絡安全網絡攻擊網絡威脅

2010-12-01 09:04:59

PHP開發

2017-11-22 14:45:59

物聯網數據數據分析

2021-03-21 22:23:38

云計算數據中心IT

2020-06-09 11:16:42

云計算云平臺工具

2021-03-02 13:53:50

人工智能智慧城市Infratech

2010-01-27 09:53:37

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美另类在线 | 美女中文字幕视频 | 九色在线 | 97精品国产 | 久久国产精品99久久久久久丝袜 | 亚洲欧美在线一区 | 亚洲一区二区三区免费在线 | 亚洲精品一区二区另类图片 | 五月婷婷激情 | 久久这里有精品 | 精品一区二区三区入口 | 欧美日韩成人影院 | 亚洲 欧美 综合 | 婷婷久久精品一区二区 | 日韩中文av在线 | 国产一级在线观看 | 99久久精品免费 | 成人免费黄视频 | 我想看一级黄色毛片 | 91久久久精品国产一区二区蜜臀 | 免费观看一级视频 | 国产又色又爽又黄又免费 | 欧美炮房 | 成人小视频在线观看 | 日韩在线国产精品 | 91精品国产高清久久久久久久久 | 91精品国产91久久久久久最新 | 91精品国产自产在线老师啪 | 欧美日韩中文字幕在线播放 | 色眯眯视频在线观看 | 欧美精品久久久久 | 亚洲欧美中文日韩在线 | 亚洲免费在线观看 | 男女羞羞免费网站 | 欧美国产日韩在线观看 | 色播久久| 九九热精品在线 | 黄色欧美在线 | 日韩午夜网站 | 久久免费小视频 | 国产高清视频 |