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() только при разнице следующего и предыдущего состояния. Это предотвратит ненужные повторные рендеры.


Назад