#javascript #reactjs #react-hooks #use-state #react-state
#javascript #reactjs #реагирующие хуки #использование-состояние #реагировать-состояние
Вопрос:
Учитывая, что вы можете получить доступ к предыдущему состоянию при изменении текущего состояния, передав функцию стрелки, как в функции секундомера ниже:
function App() {
const [time, setTime] = useState(0)
function counter() {
setTime(prev => prev 1)
}
return (
<div>
<p>{time}<p>
<button onClick={counter}>Click Me<button/>
</div>
)
}
Могу ли я сделать то же самое, когда состояние является объектом? Это проблема с синтаксисом, с которой я сталкиваюсь, или это невозможно сделать?
Что мне написать там, где у меня есть вопросительные знаки?
function App() {
const [time, setTime] = useState({sec: 0, min: 0, hour: 0})
function stopwatch() {
setTime(prev??? => ????)
}
return (
<div>
<p>{time.sec} {time.min} {time.hour}<p>
<button onClick={stopwatch}>Click Me<button/>
</div>
)
}
```
Комментарии:
1. Просто верните новый объект
setTime(prev=>({...prev, hour:prev.hour 1}))
. Я просто увеличил час, например … используйте свою собственную логику, чтобы делать то, что вам нужно2. Спасибо @charlietfl ! Это именно то, что я искал.
3. Я просто хочу указать на небольшую, тонкую, но важную деталь с обновлениями функционального состояния. На самом деле вы получаете доступ к текущему состоянию и возвращаете следующее состояние. Думайте об этом как о сверхлегком «редукторе», вместо (текущее состояние, действие) => следующее состояние, у вас есть (текущее состояние) => следующее состояние.
Ответ №1:
Я думаю, что вам следует попытаться разделить их, поскольку минуты, секунды и часы увеличиваются в разные моменты. Например, если вы хотите внести изменения в протокол, вы можете применить эту логику к объекту
function App() {
const [time, setTime] = useState({sec: 0, min: 0, hour: 0})
function stopwatch() {
setTime(prevTime => {
return {
...prevTime,
minutes: prevTimes.minutes 1 // or you could directly change it..
}
})
}
return (
<div>
<p>{time.sec} {time.min} {time.hour}<p>
<button onClick={stopwatch}>Click Me<button/>
</div>
)
}
Эта логика может быть применена к любому количеству изменений, которые вы хотите внести, минуты, секунды и часы, просто часы и т.д.