Есть ли способ добавить функцию ошибок в форме React Hook?

Я изучаю форму React и React Hook, мне удалось отобразить пользовательские сообщения под входными данными, но я также хочу отобразить предупреждение с помощью react-toastify, чтобы сообщить пользователю обо всех ошибках. Как добавить функцию из существующего сообщения об ошибке?

Я хочу что-то вроде errors && callMyFunction().

Почему бы и нет useEffect(() => ..., [errors]), если вы хотите что-то сделать, когда ошибки изменятся?

jonrsharpe 20.08.2024 13:06

Привет! Я попробовал это: useEffect(() => error && console.info("error"), [errors]) Но по какой-то причине я все равно получаю console.info при первом рендеринге, но объект ошибок должен быть пуст при первом рендерить (думаю?) @jonrsharpe

Annie 20.08.2024 13:14

«Объект ошибок должен быть пустым при первом рендеринге» - то, что вы показываете, вовсе не опровергает то, что пустой массив по-прежнему правдив.

jonrsharpe 20.08.2024 13:15

ох, ладно, это имеет смысл! как мне проверить, пусто ли оно? Я пробовал error.length, но это дает неопределенное значение

Annie 20.08.2024 13:18

что-то вроде: console.info(errors?.length) ? Я все еще не могу определиться @HamedJimoh

Annie 20.08.2024 13:39
errors?.length не определено, если errors не определено, необязательная цепочка не создает волшебным образом значение. Пожалуйста, выполните некоторую отладку, чтобы увидеть, с чем вы на самом деле имеете дело.
jonrsharpe 20.08.2024 13:50

Вот почему я спрашиваю, как поступить в этой ситуации. Ошибка Console.logging дает мне ошибки, которые я пытаюсь получить, но ошибки? Длина все еще не определена.

Annie 20.08.2024 14:04

Как я уже сказал, при первом рендеринге выдается неопределенное значение, и я не знаю, как проверить, есть ли что-нибудь внутри, прежде чем делать что-нибудь еще. Я новичок в React и React Hook Forms, поэтому не знаю, что делать.

Annie 20.08.2024 14:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
8
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я просмотрел документацию React Hook Form и понял, что свойство errorsformState возвращает объект, а не массив (https://react-hook-form.com/docs/useform/formstate). Поэтому, если вы хотите запускать всплывающее уведомление при возникновении ошибки, вы можете просто добиться этого с помощью крючка useEffect, используя этот воспроизводимый код, который я написал:

import { useEffect } from "react"
import { useForm } from "react-hook-form";
import { toast } from "react-toastify";

const ContactPage = () => {
  const { formState: { errors }, } = useForm({
    defaultValues: {
      firstName: "",
      lastName: "",
    },
    mode: "all",
  });

  useEffect(() => {
    const errorMessages = Object.values(errors);

    if (errorMessages.length > 0) {
      for (const error of errorMessages) {
        toast.error(error.message, {
          position: "top-center",
          hideProgressBar: true,
          toastId: error.message, //This prevents the toast from opening the same error message multiple times whenever errors change
        });
      }
    }
  }, [Object.values(errors).length]);
}

Я надеюсь, что это решит эту проблему для вас.

[Object.values(errors).length] не подсказывает изменение, когда происходит изменение того, какие ошибки есть, а количество ошибок остается прежним
Caleth 20.08.2024 14:53

Он действительно вызывает изменения и запускает useEffect() всякий раз, когда меняется длина errors. Я протестировал этот минимальный код.

Hamed Jimoh 20.08.2024 15:09

Проблема не в этом. Подумайте, что произойдет, если вы перейдете от { "error1": "some error" } к { "error2": "other error" }.

Caleth 20.08.2024 15:12

Форма React Hook formStateerrors структурирована не так. errors структурировано (на основе примера кода), так как состояние { errors: { "firstName": { message: "FirstName is required" } }, {"lastName": {message: "LastName is required" } } }. So this means, the errors``` length будет продолжать расти относительно ошибок отдельных полей.

Hamed Jimoh 20.08.2024 15:29

Нет, если вы измените { errors: { "firstName": { message: "FirstName is required" } } } на { errors: { "firstName": { message: "Invalid FirstName" } } } или аналогичный

Caleth 20.08.2024 15:32

Ты прав. Думаю, теперь я понял вашу точку зрения. Это был хороший улов. Спасибо.

Hamed Jimoh 20.08.2024 15:44
Ответ принят как подходящий

Функция handleSubmit получает два параметра:

  1. onValid за обработку успешных заявок.
  2. onInvalid для обработки ошибок.

onInvalid срабатывает всякий раз, когда форма отправляется с ошибками.

Вот пример:

const onError = (fieldsErrors) => {
  for (const fieldName in fieldsErrors) {
    toast.error(`Error in ${fieldName}: ${fieldsErrors[fieldName].message}`);
  }
};

Затем в вашей форме:

return (
  <form onSubmit = {handleSubmit(onSubmit, onError)}>
);

быстрый вопрос, это отлично работает (большое спасибо за функциональный пример моей собственной проблемы)! Я просто хочу уточнить, зачем здесь нужен $?

Annie 20.08.2024 15:58

Пожалуйста! $ — это литералы шаблона

Ba2sik 20.08.2024 16:03

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

Почему моя условная проверка не работает с использованием zod и формы реагирования?
Пользовательское уточнение состояния ошибки массива полей реакции-хука-формы не будет обновляться
Ошибка назначения типа в массиве объекта: машинописный текст, динамические формы с использованием пользовательского интерфейса Shadcn, форма перехвата React и ZOD
Как использовать handleSubmit формы реагирования со схемой Zod: ввод данных onSubmit как z.input вместо z.output
Как указать значение по умолчанию (но не ноль) в числовом типе в форме zod и response-hooks?
Форма перехвата React не будет правильно удалять элементы из контекста провайдера во вложенном компоненте
Рендеринг пользовательского интерфейса в React JS
FormMessage не отображает ошибку проверки zod - Shadcn, Zod, response-hook-form, Next.js
Моя кнопка отправки также отправляет другую форму
Всплывающая подсказка Shadcn/ui вокруг кнопки вызывает проверку формы