首頁 > web前端 > js教程 > 不要使用 React.Context,建立鉤子。

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

王林
發布: 2024-09-05 06:44:26
原創
731 人瀏覽過

Don

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

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


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

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

看看這個基本範例:

<ThemeContext.Provider value={theme}>
  <AuthContext.Provider value={currentUser}>
    <ModalContext.Provider value={modal}>
      <VolumeContext.Provider value={volume}>
        <RouterProvider router={router} />
      </VolumeContext.Provider>
    </ModalContext.Provider>
  </AuthContext.Provider>
</ThemeContext.Provider>
登入後複製

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

以下是使用上下文時的一些潛在問題:

  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: <div>Current theme: light</div>
  return <div>Current theme: {theme}</div>;
}
登入後複製

這種方法的優點是什麼:

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

結論

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

以上是不要使用 React.Context,建立鉤子。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板