Итак, я пытаюсь изменить состояние, используя предыдущее состояние, но ничего не меняет. Кто-нибудь может сказать мне, в чем проблема, пожалуйста?
handleToggleComplete = (key, complete) => {
itemIndex = this.state.items.findIndex(item => item.key === key);
console.info('before: ', this.state.items);
this.setState(prevState => {
return {
...prevState,
items: [
...prevState.items,
prevState.items[itemIndex]: {
completed: true,
text: 'hardcoded value'
}
]
}
});
console.info('after: ', this.state.items);
}
Журналы:
before:
[{…}]
{key: 1530370127933, completed: false, text: "some value"}
after:
[{…}]
{key: 1530370127933, completed: false, text: "some value"}





this.setState не меняет состояние сразу. Он повторно отображает компонент с обновленным состоянием. Поэтому, естественно, вы не увидите обновленное состояние в своей функции.
Вот приложение, которое демонстрирует именно это. Я отобразил в консоли текущее значение состояния и визуализирую его кнопкой:
class App extends React.Component {
constructor (props) {
super(props)
this.state = {
myState: 0
}
}
handleClick () {
let incrementState = this.state.myState + 1
console.info('State before increment:', this.state.myState)
this.setState({myState: incrementState})
console.info('State AFTER increment:', this.state.myState, '\nSee, it\'s still the same BUT the component has been updated (look at the number)!')
}
render() {
const { myState } = this.state
return (<div>
<h1>{myState}</h1>
<button onClick = {() => this.handleClick()}>Increment State</button>
</div>);
}
}
ReactDOM.render(
<App />,
document.getElementById('app')
);<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id = "app"></div>