」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 完全類型化、簡單的 React Context API 範例

完全類型化、簡單的 React Context API 範例

發佈於2024-11-16
瀏覽:440

Fully Typed, Easy React Context API Example

不必照顧上下文類型的技巧很簡單!

如果您使用上下文 API,那麼一個問題就是其類型的照顧。

另一個是必須使用多個導入才能在需要時使用它。

透過這個範例,我們解決了這兩個問題,並使 React Context API 的使用變得快速、簡單。

複製貼上範例

複製、貼上,然後只需將所有「範例」替換為您需要命名的內容即可。

(之後會有完整註解的版本。)

import {
  createContext,
  useCallback,
  useContext,
  useDeferredValue,
  useMemo,
  useState,
} from 'react';

function useContextValue(init: number = 0) {
  const [state, setState] = useState(init);

  const doubleValue = state * 2;
  const defferedStringValue = useDeferredValue(state.toString());

  const reset = useCallback(() => {
    setState(init);
  }, []);

  const value = useMemo(
    () => ({
      state,
      doubleValue,
      defferedStringValue,
      reset,
    }),
    [
      state,
      doubleValue,
      defferedStringValue,
      reset,
    ],
  );

  return value;
}

type ExampleContext = ReturnType;

const Context = createContext(null!);

Context.displayName = 'ExampleContext';

export function ExampleContextProvider({
  children,
  initValue = 0,
}: {
  children: React.ReactNode;
  initValue?: number;
}) {
  const value = useContextValue(initValue);
  return {children};
}

export function useExample() {
  const value = useContext(Context);

  if (!value) {
    throw new Error('useExample must be used within a ExampleContextProvider');
  }

  return value;
}

評論版

import {
  createContext,
  useCallback,
  useContext,
  useDeferredValue,
  useMemo,
  useState,
} from 'react';

/**
 * We create a custom hook that will have everything
 * that would usually be in the context main function
 *
 * this way, we can use the value it returns to infer the
 * type of the context
 */
function useContextValue(init: number = 0) {
  // do whatever you want inside

  const [state, setState] = useState(init);

  const doubleValue = state * 2;
  const defferedStringValue = useDeferredValue(state.toString());

  // remember to memoize functions
  const reset = useCallback(() => {
    setState(init);
  }, []);

  // and also memoize the final value
  const value = useMemo(
    () => ({
      state,
      doubleValue,
      defferedStringValue,
      reset,
    }),
    [
      state,
      doubleValue,
      defferedStringValue,
      reset,
    ],
  );

  return value;
}

/**
 * Since we can infer from the hook,
 * no need to create the context type by hand
 */
type ExampleContext = ReturnType;

const Context = createContext(null!);

Context.displayName = 'ExampleContext';

export function ExampleContextProvider({
  children,
  /**
   * this is optional, but it's always a good to remember
   * that the context is still a react component
   * and can receive values other than just the children
   */
  initValue = 0,
}: {
  children: React.ReactNode;
  initValue?: number;
}) {
  const value = useContextValue(initValue);
  return {children};
}

/**
 * We also export a hook that will use the context
 *
 * this way, we can use it in other components
 * by importing just this one hook
 */
export function useExample() {
  const value = useContext(Context);

  /**
   * this will throw an error if the context
   * is not used within the provider
   *
   * this also avoid the context being "undefined"
   */
  if (!value) {
    throw new Error('useExample must be used within a ExampleProvider');
  }

  return value;
}

最後的話

就是這樣。 Context API 比應有的更簡單、更精細,但對於需要使用它的情況來說,它是一個強大的工具。

請記住,React Context API 不是 Redux(或其他狀態管理器),您不應該將整個應用程式狀態放入其中。

嗯,可以,但可能會導致不必要的問題。

這是在 React

版本聲明 本文轉載於:https://dev.to/noriller/fully-typed-easy-react-context-api-example-4ne5?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何以最小的精度損失將 32 位元浮點數轉換為 16 位元?
    如何以最小的精度損失將 32 位元浮點數轉換為 16 位元?
    32位元到16位元浮點轉換問題:轉換32位元浮點將點數轉換為16 位元浮點數,同時最大限度地減少精度損失。轉換後的值將透過網路傳輸,優先考慮減小大小。 解決方案:本文介紹了三種解決方案:編碼IEEE 16 位元浮點 :使用支援IEEE 16 位元浮點格式的跨平台庫。 此方法適合用於32位元和16位元...
    程式設計 發佈於2024-11-16
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-16
  • 快速瀏覽JNDI(Java命名和目錄介面)
    快速瀏覽JNDI(Java命名和目錄介面)
    簡單的說,程式設計師可以使用同一個JNDI介面來查詢以下內容 尋找應用程式伺服器提供的資源,例如資料來源 搜尋 LDAP 條目 查找 DNS 記錄 簡單介紹就到這裡 程式碼 應用程式伺服器的資源放置在「java:comp/env」前綴下。假設資料來源位於 java:/comp/env...
    程式設計 發佈於2024-11-16
  • 為什麼 `p.visible:last-of-type` 不定位最後一個可見段落元素?
    為什麼 `p.visible:last-of-type` 不定位最後一個可見段落元素?
    :last-of-type 選擇器行為:last-of-type 偽類目標指定類型的最後一個元素在父容器內。但是,在 CSS 選擇器 (p.visible:last-of-type) 的上下文中,請務必注意 :last-of-type 僅適用於元素類型而不是類別實例。 在您的HTML 標籤:<...
    程式設計 發佈於2024-11-16
  • 為什麼 C 中基於指標和基於陣列的字串的「strlen」和「sizeof」產生不同的結果?
    為什麼 C 中基於指標和基於陣列的字串的「strlen」和「sizeof」產生不同的結果?
    基於指標和基於數組的字串初始化的字串長度和大小計算的不同輸出了解結果當建立具有相同值的基於指標的字串str1 和基於陣列的字串str2 時,函數strlen 和sizeof會產生不同的結果。具體來說,對於聲明:char *str1 = "Sanjeev"; char str2[]...
    程式設計 發佈於2024-11-16
  • C++ 中的強型別枚舉可以自動轉換為整數嗎?
    C++ 中的強型別枚舉可以自動轉換為整數嗎?
    自動將強型別列舉轉換為整數在C 中,列舉有兩種:強型別枚舉與常規枚舉。常規枚舉可以隱式轉換為整數,而強型別枚舉需要明確轉換。這就提出了一個問題:是否有一種自動方法可以將強型別枚舉轉換為整數,而無需使用明確強制轉換? 答案是否定的,而且這是有意為之。強型別枚舉旨在防止隱式轉換為整數。本質上,編譯器確保...
    程式設計 發佈於2024-11-16
  • 如何使用 CSS 響應式地建立具有兩個不同邊框的圓?
    如何使用 CSS 響應式地建立具有兩個不同邊框的圓?
    響應式設計具有雙邊框的圓圈創建 CSS 圓圈非常簡單,如提供的工作 CSS 所示。然而,要實現具有兩個不同邊框的圓,我們需要採用額外的 CSS 技術。 使用提供的HTML 結構,其中單一 元素代表圓:<div></div>我們可以如下修改CSS來創建一個有兩個邊框的圓:div...
    程式設計 發佈於2024-11-16
  • 如何在單一 MySQL 操作中聲明任務的所有權並檢索其資料?
    如何在單一 MySQL 操作中聲明任務的所有權並檢索其資料?
    透過單一操作在MySQL 中實現行所有權和資料擷取:當使用多個工作程序應用程式循環執行任務時,它確保每個應用程式有效地聲明對唯一任務的所有權可能具有挑戰性。 MySQL 提供了 UPDATE 和 SELECT 命令來完成此操作,但單獨執行它們可能會引入延遲和潛在的競爭條件。 要簡化流程,請考慮以下方...
    程式設計 發佈於2024-11-16
  • 如何處理 ReactJS 中的 GET 請求重新導向和 CORS 錯誤?
    如何處理 ReactJS 中的 GET 請求重新導向和 CORS 錯誤?
    在ReactJS 中處理GET 請求重定向和CORS 錯誤當ReactJS 應用程式向伺服器發送GET 請求並接收時遇到CORS錯誤302 重定向可能是一個令人沮喪的問題。以下提供了此問題的解決方案:要解決您的場景中的 CORS 錯誤,其中 ReactJS 前端 (f.com) 請求路徑“/user...
    程式設計 發佈於2024-11-16
  • 如何在 React Router v4/v5 中建立嵌套路由?
    如何在 React Router v4/v5 中建立嵌套路由?
    React Router v4/v5 的嵌套路由嵌套路由可讓您在 React 應用程式中建立用於導航的分層結構。在 React Router v4 和 v5 中,您可以透過使用 和 元件來實現這一點。 範例考慮以下範例,我們希望將應用程式劃分為前端和管理區域。 <Match pattern...
    程式設計 發佈於2024-11-16
  • 如何在 PHP 迴圈中建立動態變​​數?
    如何在 PHP 迴圈中建立動態變​​數?
    循環中的動態變數建立:綜合答案要在循環中建立變數,您可以採用以下技術:1。基於循環計數器的變數:如您所提到的,您希望變數隨著每次循環迭代而遞增。為此,您可以使用以下語法:for ( $counter = 1; $counter <= $aantalZitjesBestellen; $count...
    程式設計 發佈於2024-11-16
  • 如何衡量 Go 整合測試的測試覆蓋率?
    如何衡量 Go 整合測試的測試覆蓋率?
    確定Go 整合測試中的測試覆蓋率整合測試旨在評估整個系統的功能,通常透過模擬或控制外部依賴。然而,確定整合測試的測試覆蓋率提出了獨特的挑戰。 測量非包測試中的覆蓋率在所描述的場景中,測試與包是分開的他們測試。因此, go test -cover 指令報告覆蓋率為 0%。為了解決這個問題,可以使用 -...
    程式設計 發佈於2024-11-16
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-16
  • C++ 程式設計師如何使用 NPAPI 開發強大的瀏覽器外掛程式?
    C++ 程式設計師如何使用 NPAPI 開發強大的瀏覽器外掛程式?
    製作瀏覽器外掛:C 程式設計師指南增強網頁瀏覽器的專業功能需要開發瀏覽器外掛程式。然而,編寫這些插件的過程提出了問題,特別是對於打算使用 C 為 Windows 編寫插件的人。 開發瀏覽器外掛程式的關鍵在於利用 Netscape 外掛程式介面 (NPAPI)。 NPAPI 使開發人員能夠建立處理特定...
    程式設計 發佈於2024-11-16
  • 如果 `std::move` 實際上沒有移動任何東西,為什麼它被稱為 `std::move`?
    如果 `std::move` 實際上沒有移動任何東西,為什麼它被稱為 `std::move`?
    為什麼 std::move 命名為 std::move? std::move 函數儘管有它的名字,但它實際上並沒有移動任何東西。它只是將左值(引用物件的表達式)轉換為右值(表示臨時物件的表達式)。此轉換是透過轉換為 xvalue 類別來執行的,這與左值和純右值不同。 這種命名選擇的原因可以追溯到該概...
    程式設計 發佈於2024-11-16

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

Copyright© 2022 湘ICP备2022001581号-3