justjavac / justjavac/react-pits

React 中 setState() 是异步的

Open
#1 12 comments 6 reactions 0 assignees View on GitHub
blog React
Dominant language
HTML
Stars
29
Forks
4
PR merge metrics
No merged PRs in 30d

Description

## 0x00

> React has a setState() problem: Asking newbies to use setState() is a recipe for headaches. Advanced users have secret cures.

为了性能和其它原因,`setState` 这个 API 很容易被误用。

- `setState` 不会立刻改变 React 组件中 state 的值
- `setState` 通过引发一次组件的更新过程来引发重新绘制
- 多次 `setState` 函数调用产生的效果会合并

## 0x01

**问题**

看如下代码:

```javascript
// state.count 当前为 0
this.setState({count: state.count + 1});
this.setState({count: state.count + 1});
this.setState({count: state.count + 1});
// state.count 现在是 1,而不是 3
```

三次操作被合并为了一次。

## 0x02

**解决方式**

```javascript
this.setState((prevState, props) => ({
count: prevState.count + props.increment
}));
```

**参考资料**

- [setState() Gate](https://medium.com/javascript-scene/setstate-gate-abc10a9b2d82)
- [关于 React 中的 setState 这个API](https://github.com/iuap-design/blog/issues/185)
- [setState:这个API设计到底怎么样](https://zhuanlan.zhihu.com/p/25954470)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.