日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
簡化ReactHook的5種方法

在編寫自定義Hook時,很容易產(chǎn)生過于復(fù)雜的解決方案。這有時會導(dǎo)致不穩(wěn)定的行為,創(chuàng)建無用的重新渲染,或者只是使其更難維護??紤]到這一點,我想分享5種我發(fā)現(xiàn)的幫助簡化定制Hook的方法。

滿洲ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

1. 減少 useState 數(shù)量

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

(1) 優(yōu)先考慮易讀性

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

(2) 評估狀態(tài)對象的內(nèi)容

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

2. 利用你的Hook返回

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

 
 
 
  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 
     
  24.     
 
  • 看看這個hook,很容易看出,如果在返回中添加額外的函數(shù)或變量,hook的實現(xiàn)會很快失控。如果你不小心破壞了數(shù)組的順序,或者用不正確的名稱,會造成額外的混亂和可能的錯誤。我們可以通過更新hook返回一個對象來防止這種情況的發(fā)生,就像這樣。

     
     
     
    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 
       
    30.     
     
  • 將返回值轉(zhuǎn)換為對象還有其他好處,包括:

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

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

    3. 使用合并鉤子簡化 setState 調(diào)用

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

     
     
     
    1. function useMergeState(initialState) { 
    2.   const [state, setState] = useState(initialState); 
    3.   // 使用 useRef 來改進異步調(diào)用 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.      * 判斷狀態(tài)數(shù)據(jù)類型是否匹配,如果匹配,則繼續(xù)合并, 
    15.      * 如果不匹配,則拋出一個控制臺警告,用新的狀態(tài)覆蓋。 
    16.      */ 
    17.     if (typeof stateRef.current !== typeof newState) { 
    18.       console.warn( 
    19.         "useMergeState warning: 狀態(tài)數(shù)據(jù)類型不匹配,用新的狀態(tài)覆蓋狀態(tài)。" 
    20.       ); 
    21.       finalState = newState; 
    22.     } else { 
    23.       /** 
    24.        * 在此處理合并 
    25.        */ 
    26.       if (typeof stateRef.current == "object" && !Array.isArray(stateRef.current)) { 
    27.         // 現(xiàn)有狀態(tài)是一個對象,繼續(xù)嘗試合并 
    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

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

     
     
     
    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 
       
    31.     
     
  • 拆分后的示例掛鉤

    5. 評估 useEffect 調(diào)用,以防止不必要的重新渲染

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

    如果一個 useEffect 在同一個鉤子作用域中監(jiān)聽狀態(tài)變量,那么這個效果不應(yīng)該更新狀態(tài)本身。

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

    盡管結(jié)合使用 useEffects 有助于減少重新渲染次數(shù),但首先要優(yōu)先考慮代碼的可讀性。


    本文題目:簡化ReactHook的5種方法
    文章鏈接:http://m.5511xx.com/article/copddhe.html