Попробуйте указать пустой массив в качестве второго аргумента ловушки. Вы не хотите, чтобы это регистрировало событие каждый раз при рендеринге компонента.
const useSocketAmountReceivedState = (event: string): number => {
const [total, setTotal] = useState(0);
useEffect(() => {
Socket.on(event, () => {
console.log(total);
setTotal(total + 1);
});
return (): void => {
Socket.off(event);
};
}, [total]);
return total;
}
UPDATE:
Я обновил свой первоначальный ответ и добавил Итого в массив зависимостей React Hook.
Обратите внимание, что второй аргумент, он же массив зависимостей. Это массив, который принимает состояние или свойство. И он инструктирует React запускать эту ловушку каждый раз, когда изменяется любой из элементов в массиве зависимостей.
Если вы передадите пустой массив, то ловушка будет запускаться только при начальной загрузке после монтирования компонента.
В вашем примере, если вы передаете пустой массив, он создает закрытие. Следовательно, итоговое значение всегда будет начальным значением.
Таким образом, вы можете передать Total в массив зависимостей, который вызовет useEffect () для запуска только при изменении общего значения. В вашем примере, где второму аргументу не передан массив зависимостей, useEffect () будет запускаться каждый раз, а это не то, что нам нужно.