0

I have a function that looks like this:

select(e) {
    let { selectedItems } = this.state;

    let arr: number[] = [];
    for (var i = 0; i < 2; i++) arr = [...arr, i];

    this.setState(
      {
        selectedItems: arr,
      }
    );
  console.log(selectedItems);
  }

But when I try to console.log(selectedItems), all I get is an empty array. When I console.log(arr), I get the correct output I'm looking for -- an array of length 2. What might be going on here and how can I assign selectedItems to the value of arr?

helloWorld
  • 135
  • 3
  • 13
  • Where/when do you log? (I don't understand your sample code.) `setState` is async. Being an array isn't relevant; `setState` doesn't care about types. – Dave Newton Mar 30 '20 at 17:30
  • https://stackoverflow.com/questions/36085726/why-is-setstate-in-reactjs-async-instead-of-sync – epascarello Mar 30 '20 at 17:33

2 Answers2

1

setState takes a callback function. Try the following:

  select(e) {
    let { selectedItems } = this.state;

    let arr: number[] = [];
    for (var i = 0; i < 2; i++) arr = [...arr, i];

    this.setState({
      selectedItems: arr,
    }, function(){
        console.log(this.state);
    }.bind(this));
  }


Edgar Henriquez
  • 1,373
  • 1
  • 14
  • 17
DCR
  • 14,737
  • 12
  • 52
  • 115
1
class A {
  select(e) {
    let { selectedItems } = this.state;
    let arr: number[] = [];
    for (var i = 0; i < 2; i++) arr = [...arr, i];
    this.setState({
      selectedItems: arr
    }, function callback() {
      console.log(this.state) // will have updated value
    });
    console.log(selectedItems); // wont print anything, coz u never assign
    selectedItems = arr;
    console.log(selectedItems); // will have updated value
  }
}
xdeepakv
  • 7,835
  • 2
  • 22
  • 32