javascript - 无法写入文本字段
问题描述
我对 react 很陌生,我正在使用 react-hook 和 useState 构建一个表单来在提交后管理我的数据。
我无法使用文本字段,因为它们被阻止了。我认为我在 value/onChange 参数中犯了一些错误,但我不知道是什么类型的错误。
import React, { useState } from "react";
import {
TextField,
MenuItem,
Typography,
Checkbox,
Divider,
Button,
} from "@mui/material";
import { MdError } from "react-icons/md";
import { BsArrowRight } from "react-icons/bs";
import "../style/contactform.scss";
import { useForm } from "react-hook-form";
const initialState = {
name: "",
email: "",
};
const ContactForm = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
const [state, setState] = useState(initialState);
const { name, email } = state;
const handleInputChange = (e) => {
const { name, value } = e.target;
setState({ ...state, [name]: value });
};
const onSubmit = (e) => {
e.preventDefault();
console.log("form submit");
setState(initialState);
};
return (
<form className="contact-form" onSubmit={handleSubmit(onSubmit)}>
<Typography variant="h4" className="form-title">
Be the first.
</Typography>
<div className="form-component">
<TextField
id="standard-basic"
label="Nome*"
variant="standard"
name="nome"
value={name}
onChange={handleInputChange}
{...register("nome", {
required: true,
})}
/>
{errors?.nome?.type === "required" && (
<MdError className="form-validation-icon" />
)}
</div>
<Divider className="form-hr" />
<div className="form-component">
<TextField
id="standard-basic"
label="Email*"
variant="standard"
name="email"
value={email}
onChange={handleInputChange}
{...register("email", {
required: true,
pattern: {
value:
/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/,
},
})}
/>
{errors?.email?.type === "required" && (
<MdError className="form-validation-icon" />
)}
{errors?.email?.type === "pattern" && (
<Typography variant="p" className="form-validation-email">
Inserisci un indirizzo email valido.
</Typography>
)}
</div>
<Divider className="form-hr" />
<Button className="form-submit" type="submit" variant="contained">
<BsArrowRight />
</Button>
</form>
);
};
export default ContactForm;
文本字段完全被阻塞,但初始状态实际上正在工作,我错过了什么吗?你能帮助我吗?
解决方案
要使用 useForm 钩子分配初始值,请在defaultValues
传递给钩子的参数下传递它,如下所示:
const {
register,
handleSubmit,
reset
formState: { errors },
} = useForm({
defaultValues: initialState
});
然后只需将...register
名称和电子邮件传递给输入。无需再次为它们赋值:
<TextField
id="standard-basic"
label="Name*"
variant="standard"
name="name"
{...register("name", {
required: true,
})}
/>
// for the email..
<TextField
id="standard-basic"
label="Email*"
variant="standard"
name="email"
{...register("email", {
required: true,
pattern: {
value: /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/,},
})}
/>
如果您注意到,这些值已经不在文本字段中,并且也不需要该handleInputChange
函数。useForm 钩子会处理这个问题。
编辑:除了onSubmit
函数之外,handleSubmit
from useForm 将一个数据对象传递给函数,如下所示:
const onSubmit = (data) => {
console.log("form submitted", data);
reset(); // this can be destructured of the `useForm` hook.
};
有关更多信息,请查看他们的文档
推荐阅读
- r - How can I correct my for loop code to ensure that it is applied to each of my columns and the results are combined together?
- sql-server - SQL 更新设置值 where
- r - 如果函数参数中有NULL,有没有办法删除它们
- build - CMake - 使用外部库作为 APR
- php - Wordpress 插件开发 admin-ajax.php 400(错误请求)
- azure - 无法通过自定义子域访问 CDN 端点
- angular - Angular 库路由
- sql - SQL Server - 清理巨大的表。插入我们想要保留的数据并截断旧表
- python - 在 Word [docx] [Python 3.8.2] 中设置表格单元格的背景颜色
- mysql - SQL查询删除顶行和第一列