Реагирует на проверку пароля при обмене

#reactjs #validation #passwords #onchange

#reactjs #проверка #пароли #при обмене

Вопрос:

Я использую React-typescript для своего приложения. Я создал один глобальный компонент ввода, который я могу импортировать в любой компонент. Я создал одну форму с email помощью amp; password validation . Для проверки электронной почты я использую регулярное выражение, и оно работает нормально. Мой пароль и подтвердите проверку пароля, все работает нормально. Теперь я решил, что если пользователь введет менее 8 символов, я поймаю ошибку. Для этого я использовал регулярное выражение. Эта логика также работает нормально. Я хочу отображать длину пароля в функции handleChange, когда пользователь будет вводить, пока они не наберут более 8 символов, я покажу ошибку. После отправки формы будет показано, что оба поля ввода пароля не совпадают. Но я не могу найти логику, когда я могу добавить ошибку при изменении дескриптора. Я делюсь своим кодом в codesandbox.

Это мой код проверки формы

 import React, { useState } from "react";
import "./styles.css";
import { TextInput } from "./input";

export default function App() {
  const [formState, setFormState] = useState({
    email: ``,
    password: ``,
    passwordConfirmation: ``,
    loading: false,
    accountCreationSuccessful: false,
    errorPasswordMessage: ``,
    errorEmailMessage: ``,
    passwordLength: ``
  });

  //destructure the state
  const {
    email,
    password,
    passwordConfirmation,
    loading,
    accountCreationSuccessful,
    errorPasswordMessage,
    errorEmailMessage,
    passwordLength
  } = formState;

  const isPasswordValid = (password: any, passwordConfirmation: any) => {
    if (!password || !passwordConfirmation) return false;
    return password === passwordConfirmation;
  };

  const isEmailValid = (value: any) => {
    const emailRegex = /^(([^<>()[]\.,;:s@"] (.[^<>()[]\.,;:s@"] )*)|(". "))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/;
    return emailRegex.test(value);
  };

  const passLengthValidation = (value: any) => {
    const re = new RegExp(`^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,32}$`);
    return re.test(value);
  };

  const sendForm = (payload: any) => {
    return fetch(
      "https://run.mocky.io/v3/03659a5b-fed5-4c5f-b8d0-4b277e902ed3",
      {
        method: `POST`,
        headers: {
          Accept: `application/json`,
          "Content-Type": `application/json`
        },
        body: JSON.stringify(payload)
      }
    );
  };

  const handleChange = (e: any) => {
    setFormState({
      ...formState,
      [e.target.id]: e.target.value
    });
    //In here I want to display the error.when user will type short password
  };

  const onSubmit = async (e: any) => {
    e.preventDefault();

    setFormState({
      ...formState,
      errorPasswordMessage: isPasswordValid(password, passwordConfirmation)
        ? ``
        : `Upps sorry Password did not match 😔`,
      errorEmailMessage: isEmailValid(email)
        ? ``
        : `Upps sorry wrong email  😔`,
      passwordLength: passLengthValidation(password) ? `` : `too short password`
    });

    if (
      !isPasswordValid(formState.password, formState.passwordConfirmation) ||
      !isEmailValid(formState.email) ||
      !passLengthValidation(password)
    ) {
      return;
    }

    const response = await sendForm({
      email: formState.email,
      password: formState.password
    });

    if (response.ok) {
      setFormState({
        ...formState,
        accountCreationSuccessful: true,
        email: ``,
        password: ``,
        passwordConfirmation: ``
      });
    }
  };

  return (
    <div>
      <TextInput
        type="text"
        value={email}
        onChange={handleChange}
        id="email"
        label="Email"
        required
        error={errorEmailMessage}
      />
      <TextInput
        type="password"
        value={password}
        onChange={handleChange}
        id="password"
        required
        label="password"
        isPassword
        error={passwordLength} 
        // In here I want to display if the password is did not match  or password is too short(when user start typing). i know it should be conditional 
      />
      <TextInput
        type="password"
        value={passwordConfirmation}
        onChange={handleChange}
        id="passwordConfirmation"
        required
        label="Confirm password"
        isPassword
        error={errorPasswordMessage}
      />
      <button
        type="submit"
        name="action"
        onClick={onSubmit}
        disabled={!formState.email}
      >
        {formState.loading ? `loading...` : `save`}
      </button>
    </div>
  );
}
  

Ответ №1:

Вы можете проверить id для password поля и проверить e.target.value значение пароля и соответственно отобразить сообщение об ошибке.

 const handleChange = (e: any) => {
    let passwordError = ''
    
    if (e.target.id === 'password' amp;amp; password.length < 7) {
      passwordError = 'Password should be more than 8 characters'
    }
    
    setFormState({
      ...formState,
      [e.target.id]: e.target.value,
      errorPasswordMessage: passwordError
    });
    //In here I want to display the error.when user will type short password
  };
  

Комментарии:

1. Он не отображается, когда я набираю:(

2. Я хочу, чтобы, когда пользователь начнет вводить текст, он отобразился password is too short , вы понимаете, что я имею в виду: D. Не после отправки

3. Кроме того, ваша логика не работает, если я добавляю более 8 символов, все равно выдает мне ошибку

4. Вы правильно это проверили? -> codesandbox.io/s/email-validation-forked-fhkdk ? файл =/src/ …

5. Просто возникла странная проблема, хотя я улавливаю ошибку, но все же могу отправить форму, если пароль подтверждения тот же