建立 React 應用程式時,在 URL 中反映狀態通常很有用。這不僅使狀態可共享,還允許用戶在不丟失上下文的情況下添加書籤或刷新頁面。在這篇文章中,我們將在 TypeScript 中建立一個名為 useParamState 的自訂 React 鉤子。這個鉤子的功能類似於 useState,但它也會將狀態與 URL 中的搜尋參數同步。重要的是,它將支援複雜的物件值。
為什麼要使用ParamState?
React Router 的 useSearchParams 鉤子非常適合管理 URL 搜尋參數,但將它們與元件狀態同步可能很麻煩。 useParamState 鉤子透過以下方式解決這個問題:
- 提供類似useState的簡單API。
- 自動將狀態與 URL 搜尋參數同步。
- 支援複雜類型,包括物件。
先決條件
- 對 React、TypeScript 和 React Router 的基本了解。
- 熟悉 useState 和 useEffect。
實作 useParamState
第 1 步:設定項目
(這假設你已經知道如何建立一個 React 項目,如果你不知道如何去 Vite)
確保你已經安裝了react-router-dom:
npm install react-router-dom
步驟 2:useParamState 掛鉤
以下是實作 useParamState 掛鉤的方法:
import { useCallback, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; /** * A custom hook that syncs state with a URL search parameter. * Supports string, number, boolean, and object values. * @param key The search parameter key to sync with. * @param defaultValue The default value for the state. * @returns A stateful value, and a function to update it. */ function useParamState<t extends string number boolean object>( key: string, defaultValue: T ): [T, (newValue: Partial<t> | T) => void] { const [searchParams, setSearchParams] = useSearchParams(); const paramValue = searchParams.get(key); const [state, setState] = useState<t>(() => { if (paramValue === null) { return defaultValue; } try { return JSON.parse(paramValue) as T; } catch { return paramValue as T; } }); const setParamState = useCallback( (newValue: Partial<t> | T) => { const updatedValue = typeof newValue === 'object' && !Array.isArray(newValue) ? { ...state, ...newValue } : newValue; setState(updatedValue as T); const newSearchParams = new URLSearchParams(searchParams); newSearchParams.set(key, JSON.stringify(updatedValue)); setSearchParams(newSearchParams); }, [key, searchParams, setSearchParams, state] ); return [state, setParamState]; } export default useParamState; </t></t></t></t>
它是如何運作的
初始化:
鉤子首先檢查 URL 中是否存在指定的搜尋參數。如果是,鉤子會解析它並將其用作初始狀態。否則,它將回退到提供的預設值。
狀態更新:
setParamState 函數會更新內部狀態和 URL 中的搜尋參數。它使用 JSON.stringify 來序列化狀態,讓我們在 URL 中儲存複雜的物件。
類型支援:
該鉤子透過利用 TypeScript 的泛型和 JSON 解析來支援各種類型(字串、數字、布林值和物件)。
第三步:使用useParamState
讓我們看看如何在 React 元件中使用 useParamState:
import React from 'react'; import useParamState from './useParamState'; interface FilterState { status: string; sortBy: string; } const MyComponent: React.FC = () => { const [filter, setFilter] = useParamState<filterstate>('filter', { status: 'all', sortBy: 'date', }); return ( <div> <h2 id="Current-Filter-filter-status-Sort-by-filter-sortBy">Current Filter: {filter.status}, Sort by: {filter.sortBy}</h2> <button onclick="{()"> setFilter({ status: 'active', sortBy: filter.sortBy })}> Active </button> <button onclick="{()"> setFilter({ status: 'completed', sortBy: filter.sortBy })}> Completed </button> <button onclick="{()"> setFilter({ ...filter, sortBy: 'priority' })}> Sort by Priority </button> </div> ); }; export default MyComponent; </filterstate>
第 4 步:測試 Hook
為了確保 useParamState 鉤子按預期工作,您可以使用 @testing-library/react 編寫單元測試:
import { renderHook, act } from '@testing-library/react'; import { MemoryRouter } from 'react-router-dom'; import useParamState from './useParamState'; interface FilterState { status: string; sortBy: string; } test('should sync object state with search params', () => { const wrapper = ({ children }: { children: React.ReactNode }) => ( <memoryrouter initialentries="{['/']}">{children}</memoryrouter> ); const { result } = renderHook(() => useParamState<filterstate>('filter', { status: 'all', sortBy: 'date' }), { wrapper }); // Initial state expect(result.current[0]).toEqual({ status: 'all', sortBy: 'date' }); // Update state and URL act(() => { result.current[1]({ status: 'active', sortBy: 'priority' }); }); // Updated state expect(result.current[0]).toEqual({ status: 'active', sortBy: 'priority' }); }); </filterstate>
結論
useParamState 掛鉤簡化了狀態與 URL 搜尋參數同步的過程,使您的 React 應用程式更加健壯且用戶友好。由於支援物件等複雜類型,此鉤子是一個強大的工具,用於管理需要在頁面重新載入時保留或透過 URL 共享的狀態。
您可以進一步擴展此鉤子以處理更複雜的資料結構,但對於大多數用例,此實作將滿足您的需求。
(請對文章發表評論,以便我可以做得更好並改進我可能犯的任何錯誤,提前感謝。)
也歡迎在其他平台追蹤我
Linkedin
Github
Instagram
以上是自訂 React hook 以將狀態與 URL 同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

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

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。