Недавно я работал над крупномасштабным приложением React, которое включает в себя МНОЖЕСТВО функций, позволяющих редактировать значения на панели настроек, одновременно отображая предварительный просмотр результатов в другой панели. Упрощенное дерево React выглядело примерно так:

<ContextProvider value={{ valueFromContext, setValueFromContext }}>
   <SettingsEditor />
   <SettingsResultLivePreview />
</ContextProvider>

Где SettingsEditor и SettingsResultLivePreview — компоненты с глубоко вложенными дочерними элементами.

Теперь предположим, что у нас есть параметр valueFromContext, который можно переключать на панели SettingsEditor, и мы (очевидно) хотели бы иметь возможность предварительного просмотра результата в пределах SettingsResultLivePreview. Единственная проблема: переключение настройки стоит дорого! Не только фактическое вычисление параметра является дорогостоящим, но и значение контекста будет повторно отображать все наше (глубоко вложенное) дерево компонентов React при каждом обновлении!

Подводя итог: нам нужно живое, реактивное значение данных в пределах 1 стороны нашего дерева компонентов (SettingsEditor), в то время как обновленное значение отправляется в наш предварительный просмотр на другой стороне дерева с регулируемой скоростью.

Вот где useThrottledState вступает в игру. Крюк представляет собой:

Вставная замена для `useState` с возможностями регулирования. Немедленный доступ к локальному состоянию при отправке данных рабочим функциям с регулируемой скоростью.

Установите крючок с помощью вашего классика:

npm install use-throttled-state

Поскольку хук работает как «вставная» замена useState , API прост:

import useThrottledState from 'use-throttled-state'
...

const [value, setValue] = useThrottledState(initialValue, throttleRate, 
workerFunc)

пример использования 500 мс throttleRate

vs. 2500 ms

Итак, например, если вы находитесь в ситуации, в которой я был, когда мне нужно было обновить значение в дереве широкого контекста, ваше использование может выглядеть следующим образом:

const { setValueFromContext, valueFromContext } = useContext(SomeContext)

const [localValue, setLocalValue] = useThrottledState(valueFromContext, 500, (newValue) => { setValueFromContext(newValue) 
})

Где localValue и setLocalValue будут обновляться немедленно (посредством прямого useState), но ваша функция setValueFromContext будет вызываться только один раз в 500 миллисекунд с самым последним значением!

Я надеюсь, что useThrottledState поможет вам со всеми вашими потребностями в дросселировании!

GitHub НПМ