Как разработчики React, мы часто сталкиваемся со сценариями, когда несколько быстрых изменений состояния необходимо синхронизировать с API. Вызов API для каждого крошечного изменения может быть неэффективным и обременительным как для клиента, так и для сервера. Именно здесь в игру вступают устранение дребезга и умное управление состоянием. В этой статье мы создадим собственный перехватчик React, который захватит параллельные вызовы обновления API путем объединения полезных данных и устранения отказов вызова API.
Представьте поле ввода, в котором пользователи могут изменять настройки или предпочтения. Каждое нажатие клавиши или изменение может вызвать вызов 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
Мы создаем функцию обработки обновлений с функцией устранения дребезга, используя утилиту устранения дребезга из пользовательского интерфейса Material.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
Функция handleUpdate отвечает за сбор обновлений и запуск вызова 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