【问题标题】:Why I can't fill anything in my form in React?为什么我无法在 React 的表单中填写任何内容?
【发布时间】:2021-12-30 14:00:20
【问题描述】:

所以我有一个表格,我需要用户填写这个表格,当他们发送消息时,它应该会出现在我的 gmail 中。我为此使用 EmailJS 服务。 所以我的表格是这样的:

如您所见,用户可以向我发送消息,我的代码如下所示:

发送数据的使用状态:

const [toSend, setToSend] = useState({
        from_name: '',
        to_name: '',
        message: '',
        reply_to: '',
        subject: ''
      });

onSubmit 函数:

const onSubmit = (e) => {
        e.preventDefault();
        send(
            'service_id',
            'template_id',
            toSend,
            'user_id'
          )
            .then((response) => {
              console.log('SUCCESS!', response.status, response.text);
            })
            .catch((err) => {
              console.log('FAILED...', err);
            });
        reset();
      };

handleChange函数:

const handleChange = (e) => {
        setToSend({ ...toSend, [e.target.name]: e.target.value });
      };

使用表单钩子:

const {register, handleSubmit, formState: { errors }, reset, trigger} = useForm();

整个表格:

<form onSubmit={handleSubmit(onSubmit)}>
                    <input type="text"
                     placeholder="Name"
                     name="from_name"
                     value={toSend.from_name}
                     onChange={handleChange}
                      id="name" {...register('name', { required: "Name is required" })}
                    onKeyUp={() => {
                        trigger("name");
                      }}/>
                    {errors.name && (<span className="danger_text">{errors.name.message}</span>)}
                    <input type="text"
                     placeholder="Email"
                     name="reply_to"
                     value={toSend.reply_to}
                     onChange={handleChange}
                      id="email"  {...register("email", { required: "Email is Required" ,
                pattern: {
                  value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
                  message: "Invalid email address",
                }})}
                onKeyUp={() => {
                  trigger("email");
                }}
              />
              {errors.email && (
                <small className="danger_text">{errors.email.message}</small>
              )}
                    <input type="text"
                     placeholder=
                     "Subject" 
                     id="subj"
                     name="subject"
                     value={toSend.subject}
                     onChange={handleChange}/>
                    <input type="text"
                     placeholder="Message"
                      id="msg"
                      name="message"
                      value={toSend.message}
                      onChange={handleChange}
                       {...register('msg', { required: true })}/>
                    {errors.msg && (<small className="danger_text">Enter your message</small>)}
                    <input type="submit" className="btn_red" value="Send a message"></input>
                </form>

所以我的问题是我无法在输入中填写任何内容。当我尝试输入它只是没有输入的东西时,我猜它与所有输入中的“value=..”有关,但我不确定这里到底是什么问题。

【问题讨论】:

    标签: reactjs email react-hooks


    【解决方案1】:

    您不需要在输入上定义onChnagevalueonKeyUp,当您在输入上调用register 时,它会返回onChange,onBlur,ref,然后react-hook-forms 将通过@ 控制值987654327@。所以下面的例子应该可以解决你的问题:

    import { useForm } from 'react-hook-form';
    ...
    function MyComp() {
      const {
        register,
        handleSubmit,
        formState: { errors },
        reset,
      } = useForm();
    
      const onSubmit = (toSend) => {
        send(
            'service_id',
            'template_id',
            toSend,
            'user_id'
          )
          .then((response) => {
              console.log('SUCCESS!', response.status, response.text);
            })
          .catch((err) => {
              console.log('FAILED...', err);
           });
        reset();
      };
    
      return (
        <form onSubmit={handleSubmit(onSubmit)}>
          <input
            type="text"
            placeholder="Name"
            name="from_name"
            id="name"
            {...register('from_name', { required: 'Name is required' })}
          />
          {errors.from_name && (
            <span className="danger_text">{errors.from_name.message}</span>
          )}
          <input
            type="text"
            placeholder="Email"
            name="reply_to"
            id="email"
            {...register('reply_to', {
              required: 'Email is Required',
              pattern: {
                value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
                message: 'Invalid email address',
              },
            })}
          />
          {errors.reply_to && (
            <small className="danger_text">{errors.reply_to.message}</small>
          )}
          <input
            type="text"
            placeholder="Subject"
            id="subj"
            name="subject"
            {...register('subject')}
          />
          <input
            type="text"
            placeholder="Message"
            id="msg"
            name="message"
            {...register('message', { required: true })}
          />
          {errors.message && <small className="danger_text">Enter your message</small>}
          <input type="submit" className="btn_red" value="Send a message"></input>
        </form>
      );
    }
    

    顺便说一句,考虑register 与输入的name 一起使用,而不是id

    【讨论】:

    • 嗨!我应该删除useState吗?因为在你的例子中它不存在
    • 嗨,是的,你不需要它,表单的值将通过react-hooks-form传递给onSubmit。
    猜你喜欢
    • 2017-07-05
    • 2021-10-01
    • 2017-12-08
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多