跳到主要内容

setState同步异步

在React中,setState()可以用来更新组件的状态(state)。它有两种使用方式,同步和异步。

同步方式: 当在React组件中使用setState()时,它默认是异步更新。但是,你可以通过在setState()中传递一个回调函数,来使其同步更新状态。例如:


this.setState({ count: this.state.count + 1 }, () => {
console.log('count is now', this.state.count);
});

这个回调函数会在state更新完毕之后被调用。因此,在回调函数中访问state,你可以得到最新的状态值。

异步方式: 默认情况下,React使用异步更新state,这意味着当你调用setState()时,它并不会立即更新组件状态。相反,React将在未来某个时间点批量更新组件状态,以提高性能。

例如,如果你在一个onClick事件处理函数中调用setState()多次,React会将这些更新合并成一个更新。这样,React只会更新一次DOM,而不是多次。

需要注意的是,由于setState()是异步的,因此在调用它后立即访问state的值,你可能无法得到最新的状态值。如果你需要在state更新后执行某些操作,可以使用setState()的回调函数,或者在componentDidUpdate()生命周期函数中进行操作。

React Hooks中的状态更新函数(如useState()返回的函数)也可以同步或异步更新状态。

同步方式: 如果你想在更新状态后立即获取最新的状态值,可以使用useState()的第二个参数,该参数是一个函数,用于获取最新的状态值。例如:


const [count, setCount] = useState(0);

setCount(prevCount => prevCount + 1);
console.log('count is now', count); // 这里的count仍然是旧的值0

在上面的例子中,我们使用了useState()的第二个参数prevCount来获取最新的状态值。这个参数是useState()返回的状态值,也就是count的旧值。通过这种方式,我们可以立即获取到最新的状态值。

异步方式: 与类组件的setState()方法类似,React Hooks的状态更新函数也可以异步更新状态。例如,如果你在一个onClick事件处理函数中多次调用useState()的更新函数,React会将这些更新合并成一个更新,并在未来某个时间点批量更新组件状态。这样可以提高性能,避免不必要的重渲染。

需要注意的是,由于React Hooks的状态更新函数也是异步的,因此在调用它后立即访问状态的值,你可能无法得到最新的状态值。如果你需要在状态更新后执行某些操作,可以使用useEffect() Hook,或者在组件重新渲染后进行操作。

其实复杂的多,比如17和18版本,函数和类组件,以及setTimeout等因素。