在React里最为常用的setState方式就是:

    1. import styles from './TestNumber.css'
    2. import React from 'react'
    3. class TestNumber extends React.Component {
    4. state = {
    5. number: 0
    6. }
    7. handleClick = () => {
    8. this.setState({ number: this.state.number + 1 })
    9. }
    10. render() {
    11. return (
    12. <div>
    13. <h1>{this.state.number}</h1>
    14. <input type="button" onClick={this.handleClick} value="add" />
    15. </div>
    16. )
    17. }
    18. }
    19. export default TestNumber

    假如我连续setState多次:

    1. handleClick = () => {
    2. this.setState({ number: this.state.number + 1 })
    3. this.setState({ number: this.state.number + 1 })
    4. this.setState({ number: this.state.number + 1 })
    5. }

    React内部会对state对象进行合并操作,更新state,也就是说最后number只还加1。

    这是同步的setState,会对多次操作进行合并处理。如果想要达到一次加3的效果,那么我们就要用另外一种setState的方式:

    1. import styles from './TestNumber.css'
    2. import React from 'react'
    3. class TestNumber extends React.Component {
    4. state = {
    5. number: 0
    6. }
    7. handleClick = () => {
    8. this.setState({ number: this.state.number + 1 })
    9. }
    10. addScync = () => {
    11. this.setState((preState, props) => ({ ...preState, number: preState.number + 1 }));
    12. }
    13. handleAsyncClick = () => {
    14. this.addScync()
    15. this.addScync()
    16. this.addScync()
    17. }
    18. render() {
    19. return (
    20. <div>
    21. <h1>{this.state.number}</h1>
    22. <input type="button" onClick={this.handleClick} value="add" />
    23. <input type="button" onClick={this.handleAsyncClick} value="addAsync" />
    24. </div>
    25. )
    26. }
    27. }
    28. export default TestNumber

    setState方法接收的参数还可以是一个函数,函数两个参数,一个是preState,一个是props,然后此函数返回新的state对象,这是一个异步更新state的过程,当我连续执行了三次addAsync方法的时候,每一次加1的操作都是基于上一次加1之后的state进行更新。