【问题标题】:change state with prevState用 prevState 改变状态
【发布时间】:2021-11-08 06:41:06
【问题描述】:

我需要帮助理解 prevstate。我读过what is prevstatereac-prevstatestate and lifecycle。但我还是不明白。

export default function SignInUp(props) {
  const [toggleClass, setToggleClass] = useState(false)
  const { handleLogin, handleRegister } = props

  const toggleState = () => {
    setToggleClass(!prevState)
  }

  return (
    <div className='UserContainer' style={{display: "grid", justifyContent: "center ", height: "100vh", width: "100vw"}}>
      <div className='btncontainer' style={{gridRow: "2 / 3"}}>
        <button onClick={toggleState} className='togglebtn' style={{background: "none", border: "none"}}>Signin</button>
        <button onClick={toggleState} className='togglebtn' style={{background: "none", border: "none"}}>Signup</button>
      </div>
      <SignIn handleLogin={handleLogin} className={toggleClass ? 'Disabled' : null} style={{gridRow: "2 / 3" }}/>
      <SignUp handleRegister={handleRegister} className={toggleClass ? 'Disabled' : null}/>
    </div>
  )
}

【问题讨论】:

    标签: reactjs state


    【解决方案1】:

    当排队状态更新时,通常会访问前一个状态的值以计算下一个状态。举个反例。

    /**
       * count +3 click handler using naive state updates.
       */
      const clickHandler1 = () => {
        // assume count equals some number n
        setCount(count + 1); // update queued, count === n, count = n + 1
        setCount(count + 1); // update queued, count === n, count = n + 1
        setCount(count + 1); // update queued, count === n, count = n + 1
        // when processed the count will be n + 1
      };
    
      /**
       * count +3 click handler using functional state updates.
       */
      const clickHandler2 = () => {
        // assume count equals some number n
        setCount((count) => count + 1); // update queued, count === n + 0, count = prevCount + 1
        setCount((count) => count + 1); // update queued, count === n + 1, count = prevCount + 1
        setCount((count) => count + 1); // update queued, count === n + 2, count = prevCount + 1
        // now when processed each call uses the result of the previous update
        // count will be n + 1 + 1 + 1, or n + 3
      };
    

    如果您只是简单地将几个“标准”状态更新排入队列,那么每个更新都会覆盖之前的更新。 但是如果您要使用“功能性”状态更新,它们会访问之前的状态并返回一个新的状态值。

    区别在于从前一个状态的值更新与从前一个渲染周期的状态值更新。

    对于切换值,每个下一个状态必然依赖于上一个状态,以便正确切换。

    const toggleState = () => {
      setToggleClass(toggleValue => !toggleValue);
    }
    

    这采用前一个状态,将其分配给一个名为 toggleValue 的变量,并返回该值的否定作为下一个状态值。

    【讨论】:

    • 没错,原因是setState是异步的,不能保证执行的时刻。为此,您需要传递一个回调,以便在执行 setState 的实际时刻获取先前的状态。
    • @SoniaAguilar 从技术上讲,setState 是同步的更准确,它是 React 批处理和异步处理状态更新。将setState 视为对 React 的请求,以便在下次方便时更新状态。
    • 谢谢,这样看更有意义!
    • 我同意,@DrewReese。你是对的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多