【发布时间】:2020-12-28 18:58:39
【问题描述】:
我有一个反应函数组件,它返回一个简单的表单。 我要做的就是在提交时清除字段以前的错误,然后再次验证字段。 令人惊讶的是,第一次调用 setState 并没有应用更改,但其他调用正常。
这是整个代码:
import React from "react";
import { TextField, Button } from "@material-ui/core";
export default function EditPresonalInfo() {
const [fields, setFields] = React.useState({
username: "",
usernameHelper: "",
usernameError: false,
name: "",
nameHelper: "",
nameError: false,
});
const submitForm = (e) => {
e.preventDefault();
setFields({
...fields,
usernameError: false,
usernameHelper: "",
nameError: false,
nameHelper: "",
});
if (fields.username.length < 4) {
setFields({
...fields,
usernameHelper: "use at least 4 characters",
usernameError: true,
});
return;
}
if (fields.name.length < 2) {
setFields({
...fields,
nameHelper: "use at least 2 characters",
nameError: true,
});
return;
}
};
const handleChange = (fieldName) => (event) => {
setFields({
...fields,
[fieldName]: event.target.value,
});
};
return (
<form onSubmit={submitForm}>
<TextField
label="username"
onChange={handleChange("username")}
error={fields.usernameError}
value={fields.username}
helperText={fields.usernameHelper}
/>
<TextField
label="name"
onChange={handleChange("name")}
error={fields.nameError}
value={fields.name}
helperText={fields.nameHelper}
/>
<Button type="submit">submit</Button>
</form>
);
}
有人可以帮我解决我所缺少的和有什么问题吗?
【问题讨论】:
-
我宁愿使用通常的语法(import { useState } from 'react'; 然后 useState())开始。您提到的其他电话在哪里?
-
您的
fields不会在您的函数submitForm开始时直接更新,它将在生命周期结束时更新。因此,当您稍后在函数上使用fields时,它仍然是“原始”值。 -
@DavidThery 我的意思是 if 语句中正确设置帮助文本的调用
-
@Nico_ 你的意思是因为使用了 ...fields 而字段还没有更新?
标签: reactjs setstate arrow-functions use-state