OnSubmit не работает в раскрывающемся меню response-bootstrap nav

Я пытался исправить это, но у меня закончились идеи. Это мой первый реактивный проект. Я пытаюсь добавить поисковый запрос в раскрывающийся список навигации. Я использую реакцию-бутстрап. Я знаю, что я близок к тому, чтобы он заработал, потому что, если я удалю форму и помещу ее за пределы раскрывающегося списка, например, поместив ее в заголовок, она будет работать нормально. Итак, что-то внутри раскрывающегося списка вызывает ошибку. Я сузил круг вопросов до отказа.

    <Navbar inverse collapseOnSelect>
    <Navbar.Header> ...

    </Navbar.Header>

    <Navbar.Collapse>

      <Nav pullRight>
        <NavItem eventKey = {1} href = "#" className = "nav-item">
          Home
        </NavItem>
        <NavDropdown eventKey = {3} title = "Watches" id = "basic-nav-dropdown">
          <MenuItem eventKey = {3.3} className = "nav-item">
            <form onSubmit = {this.onFormSubmit}>
              <input
                type = "text"
                value = {this.state.term}
                onChange = {this.onInputChange}
                onClick = {this.onClickStopDismiss}
              />
              <input type = "submit" value = "Submit" />
            </form>
          </MenuItem>
        </NavDropdown>
      </Nav>
    </Navbar.Collapse>
  </Navbar>

Обработчики, написанные внутри одного и того же со вкусом оформленного компонента, приведены ниже. Причина добавления onClickStopDismiss к вводу заключается в том, что, когда я выбираю панель поиска внутри раскрывающегося списка, она закрывает ее, прежде чем я смогу ввести. Добавив этот onClick к поисковому вводу, он остановил закрытие раскрывающегося списка.

Состояние передается родительскому компоненту, но здесь это не актуально, потому что внутри console.info ничего не появляется до того, как он будет передан родительскому компоненту. Итак, что-то мешает кнопке отправки.

class NavMain extends Component {
  state = {
    term: ""
  };

  onInputChange = e => {
    this.setState({ term: e.target.value });
  };

  onFormSubmit = e => {
    console.info(this.state.term);
    e.preventDefault();

    // call back function that will run when called from parent component
    this.props.onTermSubmit(this.state.term);
    this.setState({ term: "" });
  };

  onClickStopDismiss = e => {
    // e.preventDefault();
    e.stopPropagation();
  };

Любые идеи приветствуются, пожалуйста. Обновлено: в консоли нет ошибок.

ссылка здесь на скриншот изображения

Обнаруживает ли он щелчок, если вы добавляете обработчик непосредственно к кнопке? то есть: <input type = "submit" value = "Submit" onClick = {onSubmitClick}/>

Shawn Andrews 25.11.2018 04:24

Хороший момент, я забыл это проверить. Да, если я добавляю onClick в onClick = {() => console.info ("submit")} к кнопке, нажимаются консольные журналы. Я попробую запустить такую ​​форму 1 секунду

Bart 25.11.2018 04:55

WOO спасибо, все теперь работает. Поэтому вместо использования onSubmit в форме. Я использовал onClick = this.buttonFormSubmitClicked на кнопке формы. Затем в buttonFormSubmitClicked я использовал код из формы отправки, чтобы изменить состояние и поднять состояние. спасибо всем спасибо сейчас пытаюсь решить, как наградить ответ = /

Bart 25.11.2018 04:57

Рад, что помог! Я ответил, чтобы людям было легче понять, что решило вашу проблему.

Shawn Andrews 25.11.2018 05:03
Поведение ключевого слова "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) для оценки ваших знаний,...
2
4
417
2

Ответы 2

Вам необходимо назначить e.target.value переменной, прежде чем передавать ее в setState().

onInputChange = e => {
  let event = e.target.value;
  this.setState({ term: event })
}

Это происходит потому, что setState() является асинхронным, поэтому к моменту его выполнения ваша ссылка на e.target.value может существовать или не существовать.

Привет, Джогрио. Я попытался внести изменения, но все еще не работает. Форма вне раскрывающегося списка работает с вашим кодом и моим старым кодом, но форма внутри раскрывающегося меню навигации не регистрирует отправку. Я даже упростил тестирование. У onFormSubmit теперь есть console.info ('clicked'), поэтому каждый раз, когда я нажимаю "Отправить", консольный журнал должен щелкать форму за пределами навигационной панели, чтобы отобразить консоль, но консоль внутри раскрывающегося списка ничего не делает. Таким образом, даже не меняя состояние, кнопка отправки не срабатывает.

Bart 25.11.2018 04:45

В качестве обходного пути вы можете обнаружить событие отправки, добавив обработчик щелчка непосредственно к элементу input и пропустив использование форм в этом конкретном случае.

<Navbar inverse collapseOnSelect>
<Navbar.Header> ...

</Navbar.Header>

<Navbar.Collapse>

  <Nav pullRight>
    <NavItem eventKey = {1} href = "#" className = "nav-item">
      Home
    </NavItem>
    <NavDropdown eventKey = {3} title = "Watches" id = "basic-nav-dropdown">
      <MenuItem eventKey = {3.3} className = "nav-item">
        <input
          type = "text"
          value = {this.state.term}
          onChange = {this.onInputChange}
          onClick = {this.onClickStopDismiss}
        />
        <input type = "submit" value = "Submit" onClick = {onSubmit} />
      </MenuItem>
    </NavDropdown>
  </Nav>
</Navbar.Collapse>

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