html - React useState() 不会同步更新值

标签 html reactjs react-hooks

<分区>

如果在设置值后立即调用,React useState() 不会更新变量的值。

我读到了 useEffect(),但我真的不知道这对这个特定场景有何用处。

Full code (请打开控制台选项卡查看变量状态)

更新

// hook
const [ error, setError ] = useState<boolean>();
const handleSubmit = (e: any): void => {
    e.preventDefault();
    if (email.length < 4) {
      setError(true);
    }
    if (password.length < 5) {
      setError(true);
    }
    console.log(error); // <== still false even after setting it to true
    if (!error) { 
      console.log("validation passed, creating token");
      setToken();
    } else {
      console.log("errors");
    }
  };

最佳答案

让我们假设用户没有有效的凭据。问题出在这里:

if (email.length < 4) {  // <== this gets executed
  setError(true);
}
if (password.length < 5) { // <== this gets executed
  setError(true);
}
console.log(error); // <== still false even after setting it to true
if (!error) { // <== this check runs before setError(true) is complete. error is still false.
  console.log("validation passed, creating token");
  setToken();
} else {
  console.log("errors");
}

您正在使用多个独立运行的 if 检查,而不是使用一个。您的代码执行所有 if 检查。在一项检查中,您会在满足其中一个条件时调用 setError(true),但 setError() 是异步的。在调用下一个 if-check 之前,该操作不会完成,这就是为什么它看起来像是您的值从未被保存过。

您可以使用 if-else 和 useEffect 的组合来更干净地完成此操作:https://codesandbox.io/s/dazzling-pascal-78gqp

import * as React from "react";

const Login: React.FC = (props: any) => {
  const [email, setEmail] = React.useState("");
  const [password, setPassword] = React.useState("");
  const [error, setError] = React.useState(null);

  const handleEmailChange = (e: any): void => {
    const { value } = e.target;
    setEmail(value);
  };

  const handlePasswordChange = (e: any): void => {
    const { value } = e.target;
    setPassword(value);
  };

  const handleSubmit = (e: any): void => {
    e.preventDefault();
    if (email.length < 4 || password.length < 5) {
      setError(true);
    } else {
      setError(false);
    }
  };

  const setToken = () => {
    //token logic goes here
    console.log("setting token");
  };

  React.useEffect(() => {
    if (error === false) {
      setToken();
    }
  }, [error]); // <== will run when error value is changed.

  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input
          type="text"
          placeholder="email@address.com"
          onChange={handleEmailChange}
        />
        <br />
        <input
          type="password"
          placeholder="password"
          onChange={handlePasswordChange}
        />
        <br />
        <input type="submit" value="submit" />
      </form>

      {error ? <h1>error true</h1> : <h1>error false</h1>}
    </div>
  );
};

export default Login;

关于html - React useState() 不会同步更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433875/

相关文章:

javascript - Map函数中的onClick,只针对一个元素执行

javascript - 检测浏览器、标签页以及所有打开的标签页中的哪个标签页已关闭

javascript - 用 HTML/CSS/Javascript 或 w Jquery 编写的响应式图像/横幅也是可扩展的

reactjs - 在 React 中插入 unicode 字符

testing - 你如何配置 babel 以在不同的环境中以不同的配置运行

javascript - 如何使 useEffect 仅在单个依赖项发生更改时重新运行?

javascript - 如何消除水平滚动条?

html - 为什么这个 div margin-top 没有按预期工作?

javascript - React 和 ReactDOM 未使用 webpack、babel 加载

reactjs - ComponentWillUnmount 与 React Hooks 等效,可以访问状态变量的当前值?