React 애플리케이션을 구축할 때 URL에 상태를 반영하는 것이 유용한 경우가 많습니다. 이를 통해 상태를 공유할 수 있을 뿐만 아니라 사용자가 컨텍스트를 잃지 않고 페이지를 북마크하거나 새로 고칠 수 있습니다. 이 게시물에서는 TypeScript에서 useParamState라는 사용자 정의 React 후크를 만듭니다. 이 후크는 useState처럼 작동하지만 상태를 URL의 검색 매개변수와 동기화하기도 합니다. 중요한 것은 복잡한 객체 값을 지원한다는 점입니다.
React Router의 useSearchParams 후크는 URL 검색 매개변수를 관리하는 데 탁월하지만 이를 구성요소 상태와 동기화하는 것은 번거로울 수 있습니다. useParamState 후크는 다음을 통해 이 문제를 해결합니다.
( Vite로 향하지 않는 경우 반응 프로젝트를 설정하는 방법을 이미 알고 있다고 가정합니다.)
react-router-dom이 설치되어 있는지 확인하세요.
npm install react-router-dom
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( key: string, defaultValue: T ): [T, (newValue: Partial | T) => void] { const [searchParams, setSearchParams] = useSearchParams(); const paramValue = searchParams.get(key); const [state, setState] = useState (() => { if (paramValue === null) { return defaultValue; } try { return JSON.parse(paramValue) as T; } catch { return paramValue as T; } }); const setParamState = useCallback( (newValue: Partial | 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;
후크는 지정된 검색 매개변수가 URL에 존재하는지 확인하는 것으로 시작됩니다. 그렇다면 후크는 이를 구문 분석하여 초기 상태로 사용합니다. 그렇지 않으면 제공된 defaultValue로 대체됩니다.
setParamState 함수는 내부 상태와 URL의 검색 매개변수를 모두 업데이트합니다. JSON.stringify를 사용하여 상태를 직렬화하므로 복잡한 객체를 URL에 저장할 수 있습니다.
훅은 TypeScript의 제네릭 및 JSON 구문 분석을 활용하여 다양한 유형(문자열, 숫자, 부울 및 객체)을 지원합니다.
React 컴포넌트에서 useParamState를 어떻게 사용할 수 있는지 살펴보겠습니다.
import React from 'react'; import useParamState from './useParamState'; interface FilterState { status: string; sortBy: string; } const MyComponent: React.FC = () => { const [filter, setFilter] = useParamState('filter', { status: 'all', sortBy: 'date', }); return ( ); }; export default MyComponent;Current Filter: {filter.status}, Sort by: {filter.sortBy}
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 }) => ({children} ); const { result } = renderHook(() => useParamState('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' }); });
useParamState 후크는 상태를 URL 검색 매개변수와 동기화하는 프로세스를 단순화하여 React 애플리케이션을 더욱 강력하고 사용자 친화적으로 만듭니다. 객체와 같은 복잡한 유형을 지원하는 이 후크는 페이지를 다시 로드할 때 지속되거나 URL을 통해 공유되어야 하는 상태를 관리하기 위한 강력한 도구입니다.
이 후크를 더욱 확장하여 훨씬 더 복잡한 데이터 구조를 처리할 수 있지만 대부분의 사용 사례에서는 이 구현으로 요구 사항을 충족할 수 있습니다.
( 이 글을 더 좋게 만들고 제가 저지른 실수를 개선할 수 있도록 기사에 댓글을 남겨주세요. 미리 감사드립니다. )
다른 플랫폼에서도 저를 팔로우해주세요.
링크드인
Github
인스타그램
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3