3-useState + prevState

作者: 钢笔先生 | 来源:发表于2020-02-02 17:08 被阅读0次

    Time: 20200126

    import React, {useState} from 'react'
    
    function HookCounterTwo() {
        const initialCount = 0
        const [count, setCount] = useState(initialCount)
        return (
            <div>
                Count: {count}
                <button onClick={() => setCount(initialCount)}>Reset</button>
                <button onClick={() => setCount(count + 1)}>加</button>
                <button onClick={() => setCount(count - 1)}>减</button>
            </div>
        )
    }
    
    export default HookCounterTwo
    

    这样确实可以做到加减数据,但是从1-到现在的3-,相同的特点是,都不安全。

    为什么说不安全呢?

    看下面的代码:

    import React, {useState} from 'react'
    
    function HookCounterTwo() {
        const initialCount = 0
        const [count, setCount] = useState(initialCount)
        const incrementByFive = () => {
            for (let i  = 0; i < 5; i++) {
                setCount(count + 1)
            }
        }
        return (
            <div>
                Count: {count}
                <button onClick={() => setCount(initialCount)}>Reset</button>
                <button onClick={() => setCount(count + 1)}>加</button>
                <button onClick={() => setCount(count - 1)}>减</button>
                <button onClick={incrementByFive}>加5</button>
            </div>
        )
    }
    
    export default HookCounterTwo
    

    每次点击加5,但是实际上只是加1。

    因为虽然执行了五次setCount(count + 1),但是本函数体内读取的count始终都是相同的值,没有更新。

    想要访问前一个状态,则需要用下面的setCount函数调用:

    const incrementByFive = () => {
      for (let i  = 0; i < 5; i++) {
        setCount(previousCount => previousCount + 1)
      }
    }
    

    这样就可以了。

    基于这个逻辑,我们就可以写加减 :

    <button onClick={() => setCount(preCount => preCount + 1)}>加</button>
    <button onClick={() => setCount(preCount => preCount- 1)}>减</button>
    

    这个逻辑在类组件中也是存在的,比如:

    incrementCount = () => {
      this.setState(prevState => {
        return {
          count: prevState.count + 1
        }
      })
    }
    

    注意这种写法需要加一个return

    END.

    相关文章

      网友评论

        本文标题:3-useState + prevState

        本文链接:https://www.haomeiwen.com/subject/pvpqxhtx.html