Давайте предположим, что у вас есть функциональный компонент с состоянием с именем CountDown
, он получает prop
с именем value
и уменьшает это значение до тех пор, пока не достигнет 0. Теперь, чтобы сделать это с использованием системы реактивности React, вы должны сериализоватьэтот реквизит в состоянии CountDown
и меняйте его, пока он не достигнет 0. Давайте напишем такой компонент:
const CountDown = ({value}) =>{
const [current, setter] = useState(value)
if(current > 0)
setter(current-1)
return(
<div>{current}</div>
)
}
Заметили проблему?Сериализовав ваше value
в состояние CountDown
, мы просто потеряли возможность рендеринга всякий раз, когда меняется этот реквизит.Если value
никогда не изменяется, то проблем нет, но если это так, вам нужно убедиться, что ваш компонент CountDown
также рендерится.Для этого мы можем использовать хук useEffect
.
useEffect(() =>{
setter(value)
}, [value])
Передав массив зависимостей в качестве второго аргумента, мы сообщаем React выполнять обновление данного компонента только тогда, когда одно из значений передается какизменения зависимостей.