Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
184 views
in Technique[技术] by (71.8m points)

javascript - React.js form doesn't work after pressing submit button while no errors shown

I'm new to React. js., so I was trying to use the form below, but when I press the Sign up button, that is supposed to submit the form and show <SignUpFormSuccess />. There are no errors shown. Each field is filled out properly. Does anyone have any idea why the button does not submit (doesn't work)? And If I want to show the other page in case if no errors are shown, how do I do it? Would appreciate any help!

Sandbox

Solution provided by @antoineso works but not the way it is supposed to. The problem here is that I have 2 sign up variants. First is for a user, second for a business, as you can see variables in each are different, so when I fill out user's sign up, there is 1 field for companyName left empty. His solution work only because he added a default value to companyName, otherwise its still empty and the form cannot be submitted.

My validateInfo.js file

export default function validateInfo(values) {
    let errors = {};
    //email

    if (!values.email) {
        errors.email = 'Email required';
    } else if (!/S+@S+.S+/.test(values.email)) {
        errors.email = 'Email address is invalid';
    }

    if (!values.companyName.trim()) {
        errors.companyName = "Company Name required"
    }else if (!/^[A-Za-z]+/.test(values.companyName.trim())) {
        errors.companyName = 'Enter a valid company name';
    }

    //username
    if (!values.username.trim()) {
        errors.username = "Username required"
    }else if (!/^[A-Za-z]+/.test(values.username.trim())) {
        errors.username = 'Enter a valid username';
    }

    //fullname

    if (!values.fullname.trim()) {
        errors.fullname = 'Full Name required';
    }
    else if (!/^[A-Za-z]+/.test(values.fullname.trim())) {
        errors.fullname = 'Enter a valid Full Name';
    }



    //password

    if (!values.password) {
        errors.password = 'Password is required';
    } else if (values.password.length < 6) {
        errors.password = 'Password needs to be 6 characters or more';
    }

    return errors;
}

My useForm.js file looks this way:

import { useState, useEffect } from 'react';

const useForm = (callback, validate) => {
  const [values, setValues] = useState({
    username: '',
    email: '',
    fullname:'',
    password: '',
    businessEmail: '',
    companyName:''
    
  });
  const [errors, setErrors] = useState({});
  const [isSubmitting, setIsSubmitting] = useState(false);

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

  const handleSubmit = e => {
    e.preventDefault();

    setErrors(validate(values));
    setIsSubmitting(true);
  };

  useEffect(
    () => {
      if (Object.keys(errors).length === 0 && isSubmitting) {
        callback();
      }
    },
    [callback, errors, isSubmitting]
  );

  return { handleChange, handleSubmit, values, errors };
};

export default useForm;

SignUpUser.js looks this way:

import React from 'react';
import useForm from '../useForm';
import validate from '../validateInfo';
import './SignUpForm.css'


const SignUpUser = ({submitForm}) => {

    const { handleChange, values, handleSubmit, errors } = useForm(submitForm,validate);

    return (

        <div className="form-content-right">
            


            <form className="form" onSubmit={handleSubmit}>
                <h1>Join our community by setting up your account</h1>

                <div className="form-inputs">
                    <label className='form-label'>
                    </label>
                    <input
                        type="email"
                        name="email"
                        className='form-input'
                        placeholder="Email"
                        value={values.email}
                        onChange={handleChange}
                    />


                    {errors.email && <p>{errors.email}</p>}

                </div>

                <div className="form-inputs">
                    <label htmlFor="fullname" className='form-label'> </label>
                    <input
                        type="text"
                        name="fullname"
                        className='form-input'
                        placeholder="Full Name"
                        value={values.fullname}
                        onChange={handleChange}
                    />
                    {errors.fullname && <p>{errors.fullname}</p>}

                </div>

                <div className="form-inputs">
                    <label htmlFor="username" className='form-label'></label>
                    <input
                        type="text"
                        name="username"
                        className='form-input'
                        placeholder="Username"
                        value={values.username}
                        onChange={handleChange}
                    />


                    {errors.username && <p>{errors.username}</p>}
                </div>


                <div className="form-inputs">
                    <label htmlFor="password" className='form-label'> </label>
                    <input
                        type="text"
                        name="password"
                        className='form-input'
                        placeholder="Password"
                        value={values.password}
                        onChange={handleChange}
                    />

                    {errors.password && <p>{errors.password}</p>}
                </div>
                <button className="form-input-btn" type='submit'>Sign Up</button>
                <span className="form-input-login"> Already have an account?  <a href="/log-in">Login</a> </span>


            </form>


        </div>

    );
};

export default SignUpUser;



My SignUpFormUser.js file

import React, { useState } from 'react';
import SignUpUser from './SignUpUser';
import SignUpFormSuccess from './SignUpFormSuccess';
import { Link } from 'react-router-dom';


const SignUpForm = () => {
    const [isSubmitted, setIsSubmitted] = useState(false);

    function submitForm() {
        setIsSubmitted(true);
    }
    return (
        <>
            <div className="grid-container top">

                <div className="grid-item back"> 
                <Link to='/sign-up'>
                        <img src="/images/backOutline.svg" alt="" />
                    </Link>
                </div>

                <div className="grid-item logo">

                    <Link to='/' className='logo'>
                        <img src="/images/yokifyLogoBlk.svg" alt="" />
                    </Link>

                </div>

                <div className="grid-item cancel">

                    <Link to='/'>
                        <img src="/images/cancelOutline.svg" alt="" />
                    </Link>

                </div>
                </div>


                <div className='form-container'>
                    <div className="form-content-left">
                        <img src="/images/handsUp.svg" alt="people" className="form-img"/>
                    </div>

                    {!isSubmitted ? (
                        <SignUpUser submitForm={submitForm} />
                    ) : (
                            <SignUpFormSuccess />
                        )}



                
                </div>
        </>
    );
};

export default SignUpForm;


SignUpBusiness


import React from 'react';
import useForm from '../useForm';
import validate from '../validateInfo';
import './SignUpForm.css'

const SignUpBusiness = (submitForm) => {

    const { handleChange, values, handleSubmit, errors } = useForm(submitForm, validate);

    return (
        <div className="form-content-right">


            <form className="form" onSubmit={handleSubmit}>

                <h1>Set up your company's profile</h1>



                <div className="form-inputs">
                    <label className='form-label'> </label>
                   
                    <input
                        type="text"
                        name="companyName"
                        className='form-input'
                        placeholder="Company's Name"
                        value={values.companyName}
                        onChange={handleChange}
                    />


                    {errors.companyName && <p>{errors.companyName}</p>}

                </div>

                

                <div className="form-inputs">
                    
                    <input
                        type="text"
                        name="fullname"
                        className='form-input'
                        placeholder="Admin's Full Name"
                        value={values.fullname}
                        onChange={handleChange}
                    />
                    {errors.fullname && <p>{errors.fullname}</p>}

                </div>

                <div className="form-inputs">
                    
                    <input
                        type="text"
                        name="username"
                        className='form-input'
                        placeholder="Username"
                        value={values.username}
                        onChange={handleChange}
                    />
                    {errors.username && <p>{errors.username}</p>}
                </div>


                <div className="form-inputs">
                    {/* <label htmlFor="password" className='form-label'> </label> */}
                    <input
                        type="text"
                        name="password"
                        className='form-input'
                        placeholder="Password"
                        value={values.password}
                        onChange={handleChange}
                    />

                    {errors.password && <p>{errors.password}</p>}
                </div>
                <button className="form-input-btn&

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...