【问题标题】:Not able to write into textfield无法写入文本字段
【发布时间】:2021-11-16 07:48:26
【问题描述】:

我对 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;

文本字段是完全阻塞的,但初始状态实际上是有效的,我错过了什么吗? 你能帮帮我吗?

【问题讨论】:

    标签: javascript reactjs react-hooks use-state react-hook-form


    【解决方案1】:

    要使用 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 函数,useForm 中的handleSubmit 将一个数据对象传递给函数,如下所示:

    const onSubmit = (data) => {
      console.log("form submitted", data);
      reset(); // this can be destructured of the `useForm` hook.
    };
    

    更多信息请查看their documentation

    【讨论】:

    • 谢谢!另一个问题,我如何在 onSubmit ...register 值中使用然后初始化它们?编辑:谢谢,我现在注意到你的更新!
    • 很高兴我能帮上忙。如果它回答了您的问题,您可以接受它:)
    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多