Обновить состояние в методе React Hooks on Change

Мне интересно, почему React не обновляет состояние после вызова метода onChange.

Описание: Простой элемент ввода с двумя плавающими правыми значками для отображения. Один значок для отображения, если длина входного текста равна 0, а другой, если длина входного текста > 0. Но кажется, что React обновляет состояние после того, как я ввожу второй текст в свой элемент ввода.

Мне нужно:

Отображать %, если длина == 0, и отображать X, если длина > 0.

А если длина > 0, то пользователь при нажатии X устанавливает текст ввода == "" ИЛИ input.length = 0.

Проблема в том, что я могу очистить ввод, но значок % не отображается.

  const onChange = (e: any) => {
    //setting user input
    if (userInput.length > 0)
      setDisplayIcon({ default: "d-none", clear: "d-block" });
    else setDisplayIcon({ default: "d-block", clear: "d-none" });
  };

  const clearText = (e: any) => {
    setUserInput("");
  };

  return (
   
            <label id = "default" className = {`${displayIcons.default}`}>
              %
            </label>
            <label className = {`${displayIcons.clear}`} onClick = {clearText}>
              X
            </label>
  );
}

🤔 А знаете ли вы, что...
С JavaScript можно создавать расширения для различных платформ, таких как Adobe Acrobat и Microsoft Office.


2
54
2

Ответы:

Решено

Добавить настройку состояния значка отображения:

const clearText = (e: any) => {
    setUserInput("");
    setDisplayIcon({ default: "d-block", clear: "d-none" });
};

Вы не сможете в console.info обновить значение состояния внутри той же функции. Попробуйте поместить свой console.info вне функции, и вы увидите, что он действительно обновляется.

"setState - это асинхронный вызов, означающий, что если синхронный вызов вызывается, он может не обновляться в нужное время, например, знать текущее значение объекта после обновления с использованием setState, он может не получить текущее обновленное значение на консоли. Чтобы получить некоторое поведение синхронного, необходимо пройти функция вместо объекта для setState». - https://www.geeksforgeeks.org/reactjs-setstate/


Интересные вопросы для изучения

Ошибка: объекты недействительны в качестве дочернего элемента React (найдено: [object Promise]).….. При получении данных из супабазыКак вызвать состояние загрузки после того, как данные пришли один раз в SWR?Как вернуть указанные данные в функцию? JavaScriptКак расширить динамически импортированный модуль?Не удается импортировать компонент Stimulus в мое приложение Rails: Uncaught TypeError: не удалось разрешить спецификатор модуляОшибка: объекты недействительны в качестве дочернего элемента React (найдено: [object Promise]).….. При получении данных из супабазыКак вызвать состояние загрузки после того, как данные пришли один раз в SWR?Массив React Router Custom Props не загружается, но пользовательская строка загружаетсяИзменение состояния реакции из обработчика нажатия кнопки препятствует отправке формыСкрыть и показать пароль в реакции с векторным значком