Недопустимое свойство всегда ложно при первом рендеринге, реагирующая форма 7

Я разрабатываю настройку мастера для компании, в которой я работаю, этот мастер будет использоваться для входа в систему, когда пользователь попытается создать учетную запись.

Для каждого шага я условно отображаю разные входные данные, когда входные данные фактического шага настройки действительны, пользователь может перейти к следующему шагу.

Чтобы достичь этого, мне нужно знать, является ли недопустимое свойство входных данных или входных данных на текущей странице ложным, для этого я использую форму хука реакции ^ 7.43.9 и getFieldState хука useForm.

Проблема в том, что недопустимое свойство всегда ложно при первом рендеринге, оно должно быть истинным при первом рендеринге.

Я упростил код для вас, этот код только проверяет, является ли firstName.invalid (строка: 15) ложным, если оно ложно, пользователь может продолжить, если нет, пользователь должен повторить попытку.

Проверка для firstName составляет минимум 3 символа, и это необходимо, если вы нажмете кнопку без значения, вы сможете перейти к следующему шагу, и это неправильно, потому что правила проверки никогда не применяются.

Есть ли способ сделать недопустимым значение true при первом рендеринге?

Есть ли другой способ узнать, действительны ли текущие входы?

Вот код:

import { useState } from "react";
import { useForm } from "react-hook-form";

export default function App() {
  const [step, setstep] = useState(1);
  const {
    register,
    getFieldState,
    // I subscribed to errors as the documentation says
    formState: { errors },
  } = useForm({
    mode: "onChange",
  });

  const handleStep = () => {
    const firstName = getFieldState("firstName");
    if (firstName.invalid) {
      alert("oh no, invalid is true, so try again");
    } else {
      alert("excelente, invalid is false, so you can go next step");
    }
  };

  return (
    <form style = {{ padding: "1rem" }}>
      <h1>Step 1</h1>
      <input {...register("firstName", { required: true, min: 3 })} />
      <button type = "button" onClick = {() => handleStep()}>
        Continue
      </button>
    </form>
  );
}

Вы можете попробовать это на codeandbox:

https://codesandbox.io/s/upbeat-jennings-vbz1vf?file=/src/App.tsx

Это ссылка на документацию о том, как использовать getFieldState

https://react-hook-form.com/api/useform/getfieldstate/

я ценю вашу помощь

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно вас понимаю, вы хотите по существу проверить значения формы при монтировании компонента.

В этом случае вы можете использовать триггерную функцию , предоставленную useForm. А затем вызовите это при монтировании компонента с помощью хука жизненного цикла useEffect.

Ваше решение будет выглядеть примерно так:

const {
  register,
  getFieldState,
  formState: { errors },
  trigger // add this variable
} = useForm({
  mode: "onChange",
});

useEffect(() => {
  trigger(); // triggers all form validations when component is mounted
}, [])

Дополнительный выпуск

Включая ответ @adsy, упомянутый здесь, потому что это отдельная ошибка, с которой вы также сталкиваетесь.

Ты должен сделать:

<input {...register("firstName", { required: true, minLength: 3 })} />

Поскольку min относится к числовому минимуму, но вы говорите о длине строки, поэтому здесь следует использовать minLength.

Спасибо, ответ представляет собой комбинацию вашего ответа и ответа адси

Ivandez 22.04.2023 20:26

Спасибо за отзыв, я соответственно обновил свой ответ, чтобы принять это во внимание.

Barry Michael Doyle 22.04.2023 22:49

Я думаю, ты имел в виду

<input {...register("firstName", { required: true, minLength: 3 })} />

т.е. minLength и не min. Что касается числовых значений.

Спасибо, ответ представляет собой комбинацию вашего ответа и ответа Барри.

Ivandez 22.04.2023 20:26

Я не заметил, что написал min вместо minLength, логические ошибки бывает трудно заметить

Ivandez 22.04.2023 20:29

Другие вопросы по теме