Как реализовать истинную синхронизацию / асинхронную проверку на уровне записей - PullRequest
0 голосов
/ 30 сентября 2019

Я реализовал простой способ проверки записей в форме. Функции валидатора могут быть синхронизированными или асинхронными.

  const validate = useCallback(async (values: FormData) => {
        return {
              email: await sequence(values.email, required, isEmailValid, emailAlreadyExists),
              password: sequence(values.password, required, isPasswordComplex)
            };
  }, []);

Валидатором «emailAlreadyExists» является асинхронный, поэтому я должен декорировать всю свою функцию валидатора как «асинхронный». Проблема в этом случае заключается в том, что мое поле ввода перерисовывается 3 раза:

  • 1-й раз: ошибка устанавливается на undefined
  • 2-й и 3-й раз:Поле «meta.error» содержит сообщение об ошибке.

Это вызывает нежелательные эффекты в пользовательском интерфейсе. Например, я использую формы Antd, и поскольку ошибка сбрасывается до undefined и снова устанавливается, отображение ошибки ввода элемента управления Antd начинает «мигать» всякий раз, когда я набираю любое из полей ввода.

IМы разобрали официальный пример синхронизации / асинхронной реакции в окончательной форме и слегка исправили его, чтобы воспроизвести проблему. Вот ссылка на код .

Как воспроизвести:

  • Откройте консоль
  • В поле «Имя пользователя» введите «Джон "
  • (Консоль покажет сообщение об ошибке)
  • Сейчас Скопируйте имя" Ringo "и вставьте в поле Имя пользователя
  • В результате на консоли появятся 3 новые строки, первая из которых undefined.

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

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