Реагировать - event.target возвращает innerText ранее щелкнутого элемента вместо текущего щелкнутого элемента

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

Когда я нажимаю на опцию, я нацеливаюсь на innerText этой опции через event. Выглядит это так: event.target.innerText. Выбранное целевое значение затем используется для заполнения «ввода», чтобы показать выбранное пользователем значение. Именно так, как вы ожидаете, будет работать вход <select>. Целевое значение также используется для фильтрации перечисленных компонентов, но меня здесь беспокоит не это.

Когда компонент раскрывающегося меню загружается внутри метода componentDidMount(), состояние обновляется значением по умолчанию, так что раскрывающиеся меню загружаются с предварительно заполненным первым параметром (это делается для того, чтобы они не были пустыми до того, как пользователь выберет элемент). вариант).

Когда я нажимаю на опцию, чтобы сделать выбор, возвращаемый event.target.innerText относится к предыдущему выбору. Итак, если option 1 было значением по умолчанию при монтировании компонента, а затем я выбираю option 2 и console.info результат, значение будет option 1. Если я затем выберу другой вариант, option 3, возвращенным console.info() будет option 2. Это один позади.

На этом .gif вы можете видеть, что когда componentDidMount() срабатывает, это console.info() значения по умолчанию в раскрывающемся меню. Но когда я делаю выбор, вы заметите, что console.info() возвращает только event.target.innerText ранее выбранной опции.

Реагировать - event.target возвращает innerText ранее щелкнутого элемента вместо текущего щелкнутого элемента

Вот компонент:

class DropDownSelect extends Component {
  constructor(props) {
    const { inputOptions } = props;
    const { option1 } = inputOptions;
    super(props);

    this.state = {
      showOptions: false,
      selectionMade: option1
    };
  }

  setShowOptions = () => {
    const { showOptions } = this.state;
    this.setState(prevState => ({ showOptions: !prevState.showOptions }));
  };

  setSelectionMade = event => {
    const { target } = event;
    event.stopPropagation();

    this.setShowOptions();
    this.setState({ selectionMade: target.innerText });
    console.info(this.state.selectionMade);
  };

  setDefaultSelectionOnLoad = () => {
    const { inputOptions } = this.props;
    this.setState({ selectionMade: inputOptions.option1 });
  };

  componentDidMount() {
    this.setDefaultSelectionOnLoad();
    console.info(this.state.selectionMade);
  }

  render() {
    const { showOptions, selectionMade } = this.state;
    const { inputOptions } = this.props;

    const inputOptionsArray = Object.keys(inputOptions);

    return (
      <DropDownSelectMenu>
        <DropDownSelectPlaceholder onClick = {this.setShowOptions}>
          <p>{selectionMade}</p>
          <i>
            <FontAwesomeIcon icon = {faCaretDown} />
          </i>
        </DropDownSelectPlaceholder>

        {showOptions ? (
          <DropDownSelectOptions>
            {inputOptionsArray.map((key, index) => {
              return (
                <DropDownOption
                  onClick = {event => {
                    this.setSelectionMade(event);
                  }}
                  key = {index}
                >
                  {inputOptions[key]}
                </DropDownOption>
              );
            })}
          </DropDownSelectOptions>
        ) : null}
      </DropDownSelectMenu>
    );
  }
} 

Компонент стиля DropDownOption — это место, где функция, которая обновляет выделение в состоянии, добавляется в качестве обработчика onClick. Поскольку этот компонент является дочерним, и вам нужно щелкнуть родительский компонент, чтобы открыть компонент DropDownOption, я подумал, что, возможно, обработчик событий всплывает и захватывает значение event.target у родителя, поэтому я добавил event.stopPropagation() в функцию обработчика событий setSelectionMade() . Это ничего не сделало для меня.

Поведение ключевого слова "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
1 176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваш код работает нормально, только этот метод отладки не работает;)

Это одна из самых распространенных ошибок в реакции — ожидание обновления состояния сразу после вызова setState.

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

Вы можете просто console.info(selectionMade) в render (до return (), чтобы получить текущее значение.

Спасибо. Я совсем забыл об этом!

maison.m 27.05.2019 23:40

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