setState — это ключевой метод для обновления состояния в классовых компонентах React. Разберём его работу детально.
setState используется для:
class Counter extends React.Component {
state = { count: 0 };
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return <button onClick={this.increment}>{this.state.count}</button>;
}
}
setState не изменяет состояние немедленно, а ставит обновление в очередь:
setState в одно обновление (batching)// Проблема: несколько синхронных вызовов
incrementTwice() {
this.setState({ count: this.state.count + 1 });
this.setState({ count: this.state.count + 1 });
// Оба вызова получат одинаковое this.state.count
}
// Решение: функциональная форма
incrementTwiceCorrect() {
this.setState(prevState => ({ count: prevState.count + 1 }));
this.setState(prevState => ({ count: prevState.count + 1 }));
}
React выполняет shallow merge (поверхностное слияние) объектов состояния:
state = { user: 'John', posts: [] };
updateUser() {
// Слияние: posts сохраняются, user обновляется
this.setState({ user: 'Alice' });
}
При вызове setState происходит:
shouldComponentUpdate (если не false → продолжается)render (генерация нового Virtual DOM)componentDidUpdate после применения изменений к DOMsetState принимает необязательный callback, выполняемый после применения обновления:
this.setState(
{ count: 10 },
() => console.log('State updated:', this.state.count)
);
В асинхронных обработчиках React автоматически батчит обновления. Для принудительного синхронного обновления (редкие случаи!):
setTimeout(() => {
ReactDOM.unstable_batchedUpdates(() => {
this.setState({ a: 1 });
this.setState({ b: 2 });
});
}, 1000);
В функциональных компонентах:
useState не объединяет объекты состояния автоматическиsetState заменяет всё состояние (если это объект)useReducerconst [state, setState] = useState({ user: 'John', posts: [] });
// В hooks нужно вручную мержить состояние
setState(prev => ({ ...prev, user: 'Alice' }));
false из shouldComponentUpdatekey для списков уменьшают перерисовки// НЕ ДЕЛАЙТЕ ТАК!
this.state.count = 1;
this.state сразу после setState:this.setState({ count: 2 });
console.log(this.state.count); // Может показать старое значение!
setState — асинхронный метод для обновления состояния классовых компонентовthis.state и чтения состояния сразу после setStateuseState и useReducerПонимание работы setState критически важно для эффективного управления состоянием в React-приложениях.