繁体   English   中英

不要在 React 中提交表单。 使用 react-hook-form

[英]Don't working submit the form in React. With using react-hook-form

也许我不明白什么。 也许这里需要一些 ID,或者不应该在 react-hook-from 中重复输入名称。 此外,注册表格使用完全相同的代码效果很好,在我看来,我已经彻底研究了所有内容,没有任何区别。 我曾尝试在注册时提供其他名称。 但是当事件被删除时,会发生重定向,尽管它根本不在登录页面的代码中。 代码组件:

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import { schema } from '@src/shared/schema';

import Input from '@src/components/UI/Input/Input';
import Button from '@src/components/UI/Button/Button';
import Loader from '@src/components/Loader/Loader';
import { signIn } from '@src/store/actions/authActions';

const SignInPage = props => {
  const loading = useSelector(state => state.auth.loading);
  const error = useSelector(state => state.auth.error);
  const dispatch = useDispatch();
  const submitForm = auth => dispatch(signIn(auth));
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm({ mode: 'onBlur', resolver: yupResolver(schema) });

  const submitSignInHandler = data => {
    console.log(data);
    submitForm(data);
  };

  return (
    <div className="sign-in-page">
      <h2 className="sign-in-page__title">Sign In</h2>
      <form id="sign-in" className="sign-in-page__form" onSubmit={handleSubmit(submitSignInHandler)}>
        <Input
          label="Mail"
          type="email"
          errors={!!errors.email}
          errorsMessage={errors?.email?.message}
          placeholder="johnabrams@mail.com"
          {...register('email')}
        />
        <Input
          label="Password"
          type="password"
          errors={!!errors.password}
          errorsMessage={errors?.password?.message}
          placeholder="d22DAsc4ee"
          {...register('password')}
        />
        {loading && <Loader />}
        <Button type="submit" disabled={loading || error}>
          Sign In
        </Button>
        {error && <p>{error.message}</p>}
      </form>
    </div>
  );
};

export default SignInPage;

效果很好的类似代码:

import React, { useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import { schema } from '@src/shared/schema';
import parsePhoneNumberFromString from 'libphonenumber-js';

import Input from '@src/components/UI/Input/Input';
import Button from '@src/components/UI/Button/Button';
import Loader from '@src/components/Loader/Loader';
import { signUp } from '@src/store/actions/authActions';
import { Redirect } from 'react-router';

const SignUpPage = props => {
  const loading = useSelector(state => state.auth.loading);
  const error = useSelector(state => state.auth.error);
  const dispatch = useDispatch();
  const submitForm = (info, auth) => dispatch(signUp(info, auth));
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm({ mode: 'onBlur', resolver: yupResolver(schema) });
  const [successfulSubmit, setSuccessfulSubmit] = useState(false);

  const normalizePhoneNumber = value => {
    const phoneNumber = parsePhoneNumberFromString(value);
    if (!phoneNumber) {
      return value;
    }
    return phoneNumber.formatInternational();
  };

  const submitSignUpHandler = data => {
    const info = { name: data.name, phone: data.phone };
    const auth = { email: data.email, password: data.password };

    submitForm(info, auth);
    if (!loading && !error) {
      setSuccessfulSubmit(true);
    }
  };

  return (
    <div className="sign-up-page">
      <h2 className="sign-up-page__title">Sign Up</h2>
      <form id="sign-up" className="sign-up-page__form" onSubmit={handleSubmit(submitSignUpHandler)}>
        <Input
          label="Name"
          errors={!!errors.name}
          errorsMessage={errors?.name?.message}
          placeholder="John"
          {...register('name')}
        />
        <Input
          label="Mail"
          type="email"
          errors={!!errors.email}
          errorsMessage={errors?.email?.message}
          placeholder="johnabrams@mail.com"
          {...register('email')}
        />
        <Input
          label="Password"
          type="password"
          errors={!!errors.password}
          errorsMessage={errors?.password?.message}
          placeholder="d22DAsc4ee"
          {...register('password')}
        />
        <Input
          label="Phone"
          type="tel"
          errors={!!errors.phone}
          errorsMessage={errors?.phone?.message}
          onChange={event => {
            event.target.value = normalizePhoneNumber(event.target.value);
          }}
          placeholder="+7 999 777 20 20"
          {...register('phone')}
        />
        {loading && <Loader />}
        <Button type="submit" disabled={loading || error}>
          Sign Up
        </Button>
        {error && <p>{error.message}</p>}
      </form>
      {successfulSubmit && <Redirect to="/sign-in" />}
    </div>
  );
};

export default SignUpPage;errors={!!errors.name}
          errorsMessage={errors?.name?.message}
          placeholder="John"
          {...register('name')}
        />
        <Input
          label="Mail"
          type="email"
          errors={!!errors.email}
          errorsMessage={errors?.email?.message}
          placeholder="johnabrams@mail.com"
          {...register('email')}
        />
        <Input
          label="Password"
          type="password"
          errors={!!errors.password}
          errorsMessage={errors?.password?.message}
          placeholder="d22DAsc4ee"
          {...register('password')}
        />
        <Input
          label="Phone"
          type="tel"
          errors={!!errors.phone}
          errorsMessage={errors?.phone?.message}
          onChange={event => {
            event.target.value = normalizePhoneNumber(event.target.value);
          }}
          placeholder="+7 999 777 20 20"
          {...register('phone')}
        />
        {loading && <Loader />}
        <Button type="submit" disabled={loading || error}>
          Sign Up
        </Button>
        {error && <p>{error.message}</p>}
      </form>
      {successfulSubmit && <Redirect to="/sign-in" />}
    </div>
  );
};

export default SignUpPage;

我不明白原因,但我创建了一个新模式,并且表单开始工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM