Задать вопрос
newdecline
@newdecline
Front-end-developer

Почему очищается поле ввода текста?

Привет! Перенес в песочницу большой кусок кода, в надежде что поможете).
Это блок с вводом 2 полей текстовых и 1 полем для прикрепления картинки. Я поймал баг, - сценарий
1) напечатать что то в первом текстовом поле
2) прикрепить файл
3) увидеть что текстовое поле (на 1 шаге которое вводили) очистилось.
Вопрос почему очистилось?
Пробовал дебажить, увидел что onChange в EditorBlockItem выполняется два раза, если идти по сценарию, ставил консоли.лог - без результатов..

Песочница
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@twolegs
const onDrop = useCallback(async (acceptedFiles) => {
    const newImage = acceptedFiles[0];
    let hasError;

    if (newImage.size > allowedMaximumFileSize) {
      hasError = true;

      alert("Размер файла не допустим");
    }

    if (!allowedMimeTypes.includes(newImage.type)) {
      hasError = true;

      alert("Тип файла не допустим");
    }

    if (!hasError) {
      const previewBASE64 = await fileReader(newImage);

      onImageChange(name, { file: newImage, preview: previewBASE64 });
    }
  }, []);


Вот тут у вас в массиве зависимостей нет onImageChange. Соответственно, всегда выполняется onImageChange с изначальным значением (то есть пустыми полями).

P.S. Если добавить в зависимости onImageChange, то мемоизация будет бесполезна, потому выше вы создаете эту функцию каждый рендер.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dasslier
FrontEnd Developer
const onChange = (name, value) => {
    setFormFields((prevState) => ({
      ...prevState,
      [name]: value
    }));
  };


Вот тут вы заменяете весь объект состояния, поэтому очищается
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы