给setState传入回调函数

优质
小牛编辑
133浏览
2023-12-01

在async-nature-of-setState中我们已经提到过, setState其实是异步的. 因为出于性能优化考虑, React会将多次setState做一次批处理. 于是setState并不会在被调用之后立即改变我们的state.
这就意味着你并不能依赖于在调用setState方法之后state, 因为此时你并不能确认该state更新与否.
当然针对这个问题我们也有解决办法—用前一个state(previous state)作为需要传入函数的参数,将一个函数作为第二个参数传递给setState. 这样做能保证你传入的函数需要取到的state一定会是被传入的setState执行之后的state.

问题

  1. // assuming this.state.count === 0
  2. this.setState({count: this.state.count + 1});
  3. this.setState({count: this.state.count + 1});
  4. this.setState({count: this.state.count + 1});
  5. // this.state.count === 1, not 3

解决办法

  1. this.setState((prevState, props) => ({
  2. count: prevState.count + props.increment
  3. }));

举一反三

  1. // Passing object
  2. this.setState({ expanded: !this.state.expanded });
  3. // Passing function
  4. this.setState(prevState => ({ expanded: !prevState.expanded }));

参考资料: