В следующем примере у меня есть массив элементов (фруктов), которые я хочу обновить, и использую обновленный массив для выполнения других операций (в данном конкретном случае сохранение обновленного списка).Насколько я понимаю, при повторном отображении состояние будет обновляться ... но это не так ... или существует задержка между обновлением состояния и моим действием.
В функции addFruit
я вижу, что 'Peach' немедленно добавляется, но консоль из функции saveFruits
по-прежнему показывает состояние fruit
, которое остается неизменным.Как я могу обновить это, чтобы использовать немедленно.(И я знаю, что в этом случае я могу передать newFruits
переменную saveFruits
для обновления, но мне нужно fruits
для обновления и в других местах).
Простите меня, потому что это мой миллионный вопрос о реакции асинхронных состояний, но есть кое-что, что просто еще не нажимает на меня.
const { useState } = React;
function ParentComp() {
const[fruits, setFruits] = useState(['Apple', 'Orange', 'Banana', 'Pomegranate', 'Kiwi'])
const addFruit = () => {
let newFruits = Object.assign([], fruits)
newFruits.push('Peach')
setFruits(newFruits)
saveFruits()
}
const saveFruits = () => {
console.log('API req to save fruits.', fruits)
}
return (
<div>
{ fruits.map( (fruit, key) => <div key={key}>{fruit}</div> ) }
<button type="button" onClick={addFruit}>Add Peach</button>
</div>
)
}
ReactDOM.render(<ParentComp />, document.getElementById('root'))
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<div id="root"></div>