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
заменяет всё состояние (если это объект)useReducer
const [state, setState] = useState({ user: 'John', posts: [] });
// В hooks нужно вручную мержить состояние
setState(prev => ({ ...prev, user: 'Alice' }));
false
из shouldComponentUpdate
key
для списков уменьшают перерисовки// НЕ ДЕЛАЙТЕ ТАК!
this.state.count = 1;
this.state
сразу после setState
:this.setState({ count: 2 });
console.log(this.state.count); // Может показать старое значение!
setState
— асинхронный метод для обновления состояния классовых компонентовthis.state
и чтения состояния сразу после setState
useState
и useReducer
Понимание работы setState
критически важно для эффективного управления состоянием в React-приложениях.