首頁 web前端 js教程 被低估的 React Hook - useSyncExternalStore

被低估的 React Hook - useSyncExternalStore

Jul 18, 2024 pm 12:16 PM

Image description

概述

發現 React 生態系統中隱藏的強大引擎:「useSyncExternalStore」掛鉤。本文深入探討了其變革潛力,挑戰了傳統的狀態管理典範。透過無縫整合外部資料來源並增強跨組件通信,該鉤子提供了一種非常規但功能強大的方法。

與我們一起揭開useSyncExternalStore的神秘面紗。我們將剖析其機制,揭示其優點,並透過現實世界的範例展示實際應用。最後,您將掌握如何利用這個鉤子來簡化複雜性、提高效能並為您的程式碼庫帶來新的組織水平。

用法

根據 React,useSyncExternalStore 是一個 React Hook,可讓您訂閱外部儲存。但「外部商店」到底是什麼?它實際上需要兩個函數:

  • 訂閱函數應該訂閱商店並傳回取消訂閱的函數。
  • getSnapshot 函數應該從儲存讀取資料的快照。 好吧,一開始可能很難得到。我們可以進入範例。

示範

在今天的示範中,我將介紹一個經典應用程式:「待辦事項清單」。

商店

首先,我們必須定義初始狀態:

export type Task = {
  id: string;
  content: string;
  isDone: boolean;
};

export type InitialState = {
  todos: Task[];
};

export const initialState: InitialState = { todos: [] };
登入後複製

您可以看到我定義了類型,然後創建了包含待辦事項的狀態作為空數組

現在是減速器:

export function reducer(state: InitialState, action: any) {
  switch (action.type) {
    case "ADD_TASK":
      const task = {
        content: action.payload,
        id: uid(),
        isDone: false,
      };
      return {
        ...state,
        todos: [...state.todos, task],
      };

    case "REMOVE_TASK":
      return {
        ...state,
        todos: state.todos.filter((task) => task.id !== action.payload),
      };

    case "COMPLETE_TASK":
      const tasks = state.todos.map((task) => {
        if (task.id === action.payload) {
          task.isDone = !task.isDone;
        }
        return task;
      });
      return {
        ...state,
        todos: tasks,
      };

    default:
      return state;
  }
}
登入後複製

我們的減速器只有 3 個操作:ADD_TASK、REMOVE_TASK 和 COMPLETE_TASK。這是待辦事項清單邏輯的經典範例。

終於等了,店家:

let listeners: any[] = [];

function createStore(reducer: any, initialState: InitialState) {
  let state = initialState;

  function getState() {
    return state;
  }

  function dispatch(action: any) {
    state = reducer(state, action);

    emitChange();
  }

  function subscribe(listener: any) {
    listeners = [...listeners, listener];
    return () => {
      listeners = listeners.filter((l) => l !== listener);
    };
  }

  const store = {
    dispatch,
    getState,
    subscribe,
  };

  return store;
}

function emitChange() {
  for (let listener of listeners) {
    listener();
  }
}

export const store = createStore(reducer, initialState);
登入後複製

此程式碼片段示範如何在 TypeScript 中建立一個簡單的類似 Redux 的狀態管理系統。以下是其工作原理的詳細說明:

  1. listeners 數組:此數組包含監聽器函數列表,每當狀態發生變化時,這些函數都會收到通知。

  2. createStore 函數:此函數負責建立 Redux 風格的 store。它需要兩個參數:

  • reducer:一個reducer函數,負責根據目前狀態和調度的action計算下一個狀態。
  • 初始狀態:應用程式的初始狀態。
  1. state:此變數保存應用程式的目前狀態。

  2. getState 函數:傳回目前狀態。

  3. dispatch 函數:接受一個action對象,將其與目前狀態一起傳遞給reducer,用結果更新狀態,然後呼叫emitChange函數通知監聽者狀態變化。

  4. subscribe 函數:接受一個監聽器函數,將其加入監聽器陣列中,並傳回一個清理函數,可以呼叫該函數來刪除監聽器。

  5. store 物件:已建立的 store 物件保存對dispatch、getState 和 subscribe 函數的參考。

  6. emitChange 函數:遍歷偵聽器陣列並呼叫每個偵聽器函數,通知它們狀態變更。

在程式碼末尾,使用 createStore 函數建立一個存儲,並具有給定的減速器和初始狀態。現在可以匯入該儲存並在應用程式的其他部分使用它來管理和控制狀態。

要注意的是,這段程式碼提供了狀態管理系統的簡化實現,並且缺乏 Redux 等函式庫中的一些高階功能和最佳化。然而,它是理解使用監聽器和減速器函數進行狀態管理的基本概念的一個很好的起點。

使用 useSyncExternalStore 掛鉤。我們可以得到這樣的狀態:

const { todos } = useSyncExternalStore(store.subscribe, store.getState);
登入後複製

透過這個鉤子調用,我們可以全域動態地存取store,同時保持可讀性和可維護性

優點和缺點

「useSyncExternalStore」鉤子在 React 應用程式中的狀態管理上下文中既具有優點,也具有潛在的缺點:

優點:

  1. 與外部來源無縫集成:此鉤子可以輕鬆地與外部資料來源集成,從而促進統一的狀態管理方法。這種整合可以簡化對不同來源的資料的處理,增強應用程式的凝聚力。

  2. 跨組件通信:「useSyncExternalStore」促進組件之間的高效通信,簡化數據共享並減少複雜的 prop 鑽取或上下文管理的需要。

  3. 效能改進:透過集中狀態管理並最大限度地減少狀態更新的傳播,此掛鉤有可能優化渲染性能,從而提高應用程式的響應速度和效率。

  4. 簡單和乾淨的程式碼:鉤子的抽象 API 可以產生更乾淨、更有組織的程式碼,使其更易於理解和維護,特別是在大型應用程式中。

  5. 減少樣板:「useSyncExternalStore」可以減少為狀態管理編寫冗餘程式碼的需要,提供一種簡潔且一致的方式來管理應用程式範圍的狀態。

缺點:

  1. 學習曲線:不熟悉此掛鉤的開發人員在從更成熟的狀態管理解決方案過渡時可能會經歷學習曲線。適應新方法最初可能會減慢開發速度。

  2. 自訂限制:掛鉤的預訂功能可能無法完全符合每個應用程式的獨特要求。自訂超出鉤子功能的行為可能需要額外的解決方法。

  3. 潛在的抽象開銷:根據其內部機制,與專門針對應用程式需求定制的更優化的解決方案相比,該鉤子可能會在性能或內存使用方面帶來輕微的開銷。

  4. 社區和生態系統:作為一個被低估或鮮為人知的鉤子,「useSyncExternalStore」可能缺乏完善的社區和全面的生態系統,可能導致可用資源或第三方庫減少.

  5. 相容性和未來更新:與 React 未來版本的兼容性以及鉤子本身的潛在更新可能是值得關注的問題。確保長期支援和無縫升級可能需要額外的努力。

結論

總之,useSyncExternalStore 提供了一種獨特的狀態管理方法,強調無縫整合和跨組件通訊。雖然它提供了多種好處,例如改進的效能和簡化的程式碼,但開發人員應仔細評估其與專案要求的兼容性,並考慮潛在的學習曲線和限制。

以上是被低估的 React Hook - useSyncExternalStore的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1279
29
C# 教程
1257
24
Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C/C在JavaScript口譯員和編譯器中的作用 C/C在JavaScript口譯員和編譯器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

從網站到應用程序:JavaScript的不同應用 從網站到應用程序:JavaScript的不同應用 Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序 Python vs. JavaScript:比較用例和應用程序 Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

See all articles