setState()
- это метод, который используется в React для обновления состояния компонента и запуска перерисовки re-render
компонента с обновленным состоянием.
setState(updater, [callback])
Когда вызывается setState()
, React обновляет состояние компонента, объединяя его с новыми данными, переданными в качестве аргумента. Затем React перерисовывает компонент с обновленным состоянием, что приводит к обновлению отображения на экране.
Обновление состояния с помощью setState()
является асинхронным и может быть объединено (batched
) для оптимизации производительности. Это означает, что несколько вызовов setState()
могут быть объединены в одно обновление состояния, чтобы уменьшить количество перерисовок компонента и повысить производительность.
incrementCount() {
this.setState((state) => {
// Важно: используем `state` вместо `this.state` при обновлении.
return {count: state.count + 1}
});
}
handleSomething() {
// Возьмём снова для примера, что `this.state.count` начинается с 0.
this.incrementCount();
this.incrementCount();
this.incrementCount();
// Если посмотреть на значение `this.state.count` сейчас, это будет по-прежнему 0.
// Но когда React отрендерит компонент снова, будет уже 3.
}
Например, представим, что у нас есть компонент Counter
, который отображает счетчик и имеет кнопку для его увеличения. Мы можем использовать setState()
для обновления состояния компонента при нажатии на кнопку:
class Counter extends React.Component {
constructor(props) {
super(props)
this.state = { count: 0 }
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
this.setState({ count: this.state.count + 1 })
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.handleClick}>Increment</button>
</div>
)
}
}
Здесь мы используем setState()
в обработчике события handleClick
для обновления состояния компонента Counter
. При каждом клике на кнопку Increment
вызывается setState()
, что приводит к обновлению состояния компонента и его перерисовке с новым значением счетчика.
> Какой второй аргумент можно передать опционально в setState и какова его цель?
Второй аргумент, который можно передать в метод setState()
- это функция обратного вызова (callback), которая будет выполнена после того, как состояние компонента будет обновлено и компонент будет перерисован.
Цель этой функции обратного вызова - выполнить какой-либо дополнительный код после обновления состояния компонента. Например, это может быть выполнение каких-то действий, которые зависят от обновленного состояния компонента, или выполнение каких-то действий после перерисовки компонента.
Вот пример использования функции обратного вызова в setState()
:
class MyComponent extends React.Component {
constructor(props) {
super(props)
this.state = { count: 0 }
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
this.setState({ count: this.state.count + 1 }, () =>
console.log("Count updated:", this.state.count),
)
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.handleClick}>Increment</button>
</div>
)
}
}
Здесь мы передаем вторым аргументом функцию обратного вызова, которая выводит обновленное значение счетчика в консоль после его обновления. При каждом клике на кнопку Increment
вызывается setState()
, обновляя состояние компонента и вызывая функцию обратного вызова после обновления.
setState()
всегда приводит к повторному рендеру, если только shouldComponentUpdate()
не возвращает false
. Если используются мутабельные объекты, и условие рендеринга не может быть реализовано в shouldComponentUpdate()
, вызывайте setState()
только при разнице следующего и предыдущего состояния. Это предотвратит ненужные повторные рендеры.