ReactJs - невозможно обновить состояние с помощью setState - PullRequest
0 голосов
/ 30 мая 2020

У меня проблемы с обновлением моего состояния с помощью setState.

У меня есть родительский компонент, в котором я определяю свое состояние, а также функция handleClick, которая должна обновлять состояние.

export default class Main extends PureComponent {

  state = { 
    selectedName: '',
    selectedTasks: [],
    data: [
      { 
        name: 'John', 
        tasks: ['vacuum', 'cut grass']
      },
      { 
        name: 'Jack', 
        tasks: ['cook breakfast', 'clean patio']
      }
   ]

  handleClick = e => {
    console.log('Name: ', e.name);
    console.log('Tasks', this.state.data.find(el => el.name === e.name).tasks)
    const { selectedName, selectedTasks } = this.state;
    this.setState({
      selectedName: e.name
      selectedTasks: this.state.data.find(el => el.name === e.name).tasks
    });
    console.log('stateAfter', this.state)
  };

  render() {
    const { data } = this.state;
    return (
      <div>
        <Child
          data={data}
          handleClick={this.handleClick.bind(this)}
        />
      </div>
    )
  }
}

У меня есть дочерний компонент, который принимает handleClick в качестве свойств.

export default class Child extends PureComponent {
  constructor(props) {
      super(props);
  }

  render() {
    console.log('data', this.props.data);
    return (
      <ResponsiveContainer width="100%" height={500}>
      <PieChart height={250}>
        <Pie
          data={this.props.data}
          onClick={this.props.handleClick}
        />
      </PieChart>
    </ResponsiveContainer>
    );
  }
}

Когда я выполняю функцию handleClick в первый раз, ничего не обновляется. Но когда я выполняю его второй раз, состояние обновляется. Что мне не хватает, чтобы состояние обновлялось в первый раз?

1 Ответ

2 голосов
/ 30 мая 2020

this.setState является асинхронным. Если вы sh занесете в console.log свое состояние после setState, вам придется сделать это через обратный вызов.

this.setState({
   selectedName: e.name
   selectedTasks: this.state.data.find(el => el.name === e.name).tasks
}, 
() => {
   console.log('stateAfter', this.state)
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...