В React-компоненте: function Counter(){ const [c,setC]=useState(0); useEffect(()=>{ setInterval(()=>setC(c+1),1000); },[]); return {c}; } — почему счётчик не увеличивается как ожидается и как поправить код
Проблема: в эффекте с пустым массивом зависимостей ([][][]) замыкание фиксирует начальное значение состояния c=0c=0c=0. Интервал вызывает `setC(c+1)`, где ccc всегда равно начальному значению, поэтому значение постоянно присваивается 111 и не растёт. Кроме того интервал не очищается при размонтировании. Исправление — использовать функциональный апдейтер (чтобы брать актуальное состояние) и очищать интервал: function Counter() { const [c, setC] = useState(000); useEffect(() => { const id = setInterval(() => setC(prev => prev + 111), 100010001000); return () => clearInterval(id); }, []); return {c}; } Альтернатива (не рекомендую): добавлять ccc в массив зависимостей — это создаст новый интервал при каждом изменении состояния, если не очищать старый, приведёт к утечкам. Функциональный апдейтер — простое и корректное решение.
Исправление — использовать функциональный апдейтер (чтобы брать актуальное состояние) и очищать интервал:
function Counter() {
const [c, setC] = useState(000);
useEffect(() => {
const id = setInterval(() => setC(prev => prev + 111), 100010001000);
return () => clearInterval(id);
}, []);
return {c};
}
Альтернатива (не рекомендую): добавлять ccc в массив зависимостей — это создаст новый интервал при каждом изменении состояния, если не очищать старый, приведёт к утечкам. Функциональный апдейтер — простое и корректное решение.