」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 不要使用 React.Context,建立鉤子。

不要使用 React.Context,建立鉤子。

發佈於2024-11-01
瀏覽:510

Don

在本文中,我們將了解如何擺脫應用程式中的 React.Context 並找到這樣做的動機。

如果您閱讀本文,您可能熟悉 React,並且可能已經有了 React.Context 的經驗,但如果沒有,請隨時閱讀它並與可能感興趣的人分享。


1. 為什麼要避免使用 React.Context?

上下文會降低可讀性、糾纏和限制應用程式。

看看這個基本範例:


  
    
      
        
      
    
  

看起來不太容易理解和可靠,是嗎?

以下是使用情境時的一些潛在問題:

  1. 使用的上下文越多,您的應用程式的可讀性和可控性就越差;
  2. 有時,嵌套上下文需要正確的順序才能運作,這使得您的應用程式難以維護;
  3. 在設定測試環境期間應重複使用一些情境以保持正常運作;
  4. 您必須確保該元件是必要上下文提供者樹中的子元件。

有趣的事實:眾所周知的「承諾地獄」看起來很相似 ?‍♂️

loadClients()
  .then((client) => {
    return populate(client)
      .then((clientPopulated) => {
        return commit(clientPopulated);
      });
  });

2.如何替換React.Context?

改為創建掛鉤。

讓我們用自訂 useTheme 掛鉤取代上面範例中的 ThemeContext:

import { useAppEvents } from 'use-app-events';

const useTheme = () => {
  const [theme, setTheme] = useState('dark');

  /** Set up communication between the instances of the hook. */
  const { notifyEventListeners, listenForEvents } = useAppEvents();

  listenForEvents('theme-update', (themeNext: string) => {
    setTheme(themeNext);
  });

  const updateTheme = (themeNext: string) => {
    setTheme(themeNext);

    notifyEventListeners('theme-update', themeNext);
  };

  return {
    theme,
    updateTheme,
  };
};

我們使用了一個名為 use-app-events 的 npm 套件來讓 useTheme 掛鉤的所有實例進行通訊以同步其主題狀態。它確保在應用程式中多次調用 useTheme 時主題值相同。

此外,得益於 use-app-events 包,即使在瀏覽器標籤之間主題也將同步

此時,不再需要 ThemeContext,因為可以在應用程式中的任何位置使用 useTheme 掛鉤來獲取當前主題並更新它:

const App = () => {
  const { theme, updateTheme } = useTheme();

  updateTheme('light');

  // Output: 
Current theme: light
return
Current theme: {theme}
; }

此方法的優點是什麼:

  1. 在孩子們可以使用它之前,不需要在樹上的某個地方設置一個鉤子(包括測試環境);
  2. 渲染結構更清晰,這意味著不再根據上下文建立令人困惑的箭頭形結構;
  3. 選項卡之間的狀態同步。

結論

React.Context 確實是一個強大的工具,但如果與 use-app-events 套件一起正確實現,鉤子提供了一種更受控制和更可靠的方式來管理應用程式的全域狀態。

版本聲明 本文轉載於:https://dev.to/maqs/dont-use-reactcontext-create-hooks-40a9?1如有侵犯,請聯繫[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3