【问题标题】:React js - useState returns different values inside and outside of a onChange Form functionReact js - useState 在 onChange Form 函数内部和外部返回不同的值
【发布时间】:2021-09-07 14:18:26
【问题描述】:

我想知道为什么loginPassword.lengthloginPasswordErrorloginFormPasswordHandler内部和外部不同

import React, {useState} from 'react';
import './styles.css'

const App = () => {

  const [loginPassword, setLoginPassword] = useState('');
  const [loginPasswordError, setLoginPasswordError] = useState();
  const [submitController, setSubmitController] = useState(false);

  const loginFormSubmitHandler = (e) => {
    e.preventDefault();
  }



  const loginFormPasswordHandler = (e) => {
    setLoginPassword(e.target.value);
    setLoginPasswordError(loginPassword.length < 8);
    console.log('login password length is(inside):'+loginPassword.length+' and the state is '+loginPasswordError)
    loginPassword.length > 8 ? setSubmitController(true) : setSubmitController(false);
  }

  console.log('login password length is(outside):'+loginPassword.length+' and the state is '+loginPasswordError)

  return(
  <React.Fragment>
    <div className="form-wrapper">
      <form onSubmit={loginFormSubmitHandler}>
        <input className={`${loginPasswordError && 'error'}`} type="password" id="password" name="password" placeholder="Password" onChange={loginFormPasswordHandler} />
        <div className={`submit-btn ${submitController ? '' : 'disable'}`}>
          <input type="submit" />
        </div>
      </form>
    </div>
  </React.Fragment>
  );
}

export default App;

我知道useState 在状态改变时会重新运行整个代码。但我无法理解这种行为。我不确定这是 Javascript 属性还是 React 属性。

【问题讨论】:

    标签: javascript reactjs use-state react-forms


    【解决方案1】:

    setState 是异步的,这意味着您的登录密码和错误状态值可能不会在您运行 setLoginPassword 和 setLoginPasswordError 后立即更新。

    下面的另一行在每次渲染时都会重新运行,因此它将输出最新的值。

    console.log('login password length is(outside):'+loginPassword.length+' and the state is '+loginPasswordError)
    

    【讨论】:

    • 感谢@Rishav 的回复。所以,如果我希望密码长度至少为 9 个字符,我应该将 loginPassword.length &gt; 8 ? setSubmitController(true) : setSubmitController(false); } 更改为 loginPassword.length &gt; 7 ? setSubmitController(true) : setSubmitController(false); } 还是有其他方法/我做错了吗?
    • 你可以只使用 e.target.value.length > 8 吗? setSubmitController(true) : setSubmitController(false) 而不是依赖状态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2011-08-01
    • 2013-09-14
    • 2017-10-08
    • 2014-05-27
    相关资源
    最近更新 更多