Я вижу одно решение вашей проблемы.
Сначала необходимо уменьшить массив зависимостей useEffect до одного значения (с помощью ловушки useMemo
).
Тогда в результате вы должны использовать useRef
для хранения старого значения этого значения зависимости, чтобы вы могли вызывать функцию fn
только тогда, когда зависимость изменилась .
Вот код пользовательского хука:
function useEffectSkipFirst(fn, depValue) {
const oldDepValueRef = useRef(depValue);
useEffect(() => {
if (depValue !== oldDepValueRef.current) {
// Note that this code will not be executed the first time as
// we initialized oldDepValueRef with depValue
fn();
oldDepValueRef.current = depValue;
}
}, [fn, depValue]);
}
Вот код, чтобы уменьшить массив массива до одного значения, используя useMemo
:
// I decided the return an object but it could be an array or something else
const depValue = useMemo(() => ({}), [clicks, date]);
useEffectSkipFirst(addEffectRunTimes, depValue);
function addEffectRunTimes() {
// When the value depends on the previous value,
// you can use a function to update the state value
setTseEffectRunTimes(v => v + 1);
}
Кстати, если в эффекте используется только функция addEffectRunTimes
, вы можете написать:
useEffectSkipFirst(() => setTseEffectRunTimes(v => v + 1), depValue);