React 개발자로서 우리는 여러 개의 빠른 상태 변경을 API와 동기화해야 하는 시나리오에 자주 직면합니다. 모든 작은 변경 사항에 대해 API 호출을 수행하는 것은 비효율적일 수 있으며 클라이언트와 서버 모두에 부담을 줄 수 있습니다. 이것이 디바운싱과 영리한 상태 관리가 작용하는 곳입니다. 이 기사에서는 페이로드를 병합하고 API 호출을 디바운싱하여 병렬 API 업데이트 호출을 캡처하는 사용자 정의 React 후크를 구축합니다.
사용자가 설정이나 기본 설정을 조정할 수 있는 입력 필드를 상상해 보세요. 각 키 입력이나 조정은 API 호출을 트리거하여 새 상태를 저장할 수 있습니다. 사용자가 빠르게 연속해서 여러 가지 변경을 수행하면 API 요청이 급증할 수 있습니다.
디바운싱은 함수가 실행될 수 있는 속도를 제한하는 데 사용되는 기술입니다. 함수를 즉시 호출하는 대신, 함수를 실행하기 전에 일정 기간 동안 활동이 없을 때까지 기다립니다. 지연 시간이 끝나기 전에 다른 전화가 오면 타이머가 재설정됩니다.
React에서 useRef는 다시 렌더링을 트리거하지 않고도 렌더링 간에 변경 가능한 값을 유지할 수 있는 후크입니다. 본질적으로 변경 가능한 값을 보유하는 컨테이너입니다.
코드를 자세히 살펴보고 모든 것이 어떻게 결합되는지 이해해 보겠습니다.
import { debounce } from "@mui/material"; import { useCallback, useEffect, useRef } from "react"; type DebouncedUpdateParams = { id: string; params: Record; }; function useDebouncedUpdate( apiUpdate: (params: DebouncedUpdateParams) => void, delay: number = 300, ) { const accumulatedUpdates = useRef (null); const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current; const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], ); useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]); return handleUpdate; } export default useDebouncedUpdate;
수신되는 모든 업데이트의 결합된 매개변수를 저장하기 위해 누적 업데이트라는 useRef를 초기화합니다.
const 누적Updates = useRef
머티리얼 UI의 디바운스 유틸리티를 사용하여 디바운싱된 함수 processUpdates를 생성합니다.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
handUpdate 함수는 업데이트를 누적하고 디바운스된 API 호출을 트리거하는 역할을 담당합니다.
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
메모리 누수를 방지하기 위해 구성 요소가 마운트 해제될 때 디바운싱된 기능을 지웁니다.
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
구성요소에서 이 후크를 사용하는 방법은 다음과 같습니다.
import React from "react"; import useDebouncedUpdate from "./useDebouncedUpdate"; function SettingsComponent() { const debouncedUpdate = useDebouncedUpdate(updateSettingsApi, 500); const handleChange = (settingName, value) => { debouncedUpdate({ id: "user-settings", params: { [settingName]: value }, }); }; return (handleChange("username", e.target.value)} /> handleChange("notifications", e.target.checked)} />); } function updateSettingsApi({ id, params }) { // Make your API call here console.log("Updating settings:", params); }
디바운싱과 상태 축적을 결합하여 효율적이고 반응성이 뛰어난 애플리케이션을 만들 수 있습니다. useDebouncedUpdate 후크는 빠른 변경 사항을 함께 일괄 처리하여 불필요한 API 호출을 줄이고 성능을 향상시킵니다.
주요 시사점:
이 후크를 프로젝트에 자유롭게 통합하고 특정 요구 사항에 맞게 조정하세요. 즐거운 코딩하세요!
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3