Как создать динамический поисковый фильтр в JS?

Я пытаюсь внедрить фильтр поиска в reactjs, я пробовал метод привязки к событию onChange, но он срабатывал для каждой буквы. Как заставить его работать после ввода 3 букв.

    

     var FilteredList = React.createClass({
      filterList: function(event){
        var updatedList = this.state.initialItems;
        updatedList = updatedList.filter(function(item){
          return item.toLowerCase().search(
            event.target.value.toLowerCase()) !== -1;
        });
        this.setState({items: updatedList});
      },
      getInitialState: function(){
         return {
           initialItems: [
             "Apples",
             "Broccoli",
             "Chicken",
             "Duck",
             "Eggs",
             "Fish",
             "Granola",
             "Hash Browns"
           ],
           items: []
         }
      },
      componentWillMount: function(){
        this.setState({items: this.state.initialItems})
      },
      render: function(){
        return (
          <div className = "filter-list">
            <form>
            <fieldset className = "form-group">
            <input type = "text" className = "form-control form-control-lg" placeholder = "Search" onChange = {this.filterList}/>
            </fieldset>
            </form>
          <List items = {this.state.items}/>
          </div>
        );
      }
    });
    
    var List = React.createClass({
      render: function(){
        return (
          <ul className = "list-group">
          {
            this.props.items.map(function(item) {
              return <li className = "list-group-item" data-category = {item} key = {item}>{item}</li>
            })
           }
          </ul>
        )  
      }
    });
    
    React.render(<FilteredList/>, document.getElementById('app'));

Https://codepen.io/mtclmn/pen/QyPVJp, я пытался изменить этот код для своего случая, но я застрял с запуском его после сценария с тремя буквами.

Любая идея будет высоко оценена.

Поделитесь, что вы уже пробовали. Возможно, что-то столь же простое, как не запускать функцию поиска до тех пор, пока в поле ввода не будет 3 символов, будет простым трюком для достижения того же.

tsamridh86 21.12.2020 07:26

Пожалуйста, посетите справочный центр , совершите тур , чтобы узнать, что и Как спросить . Проведите небольшое исследование, поищите связанные темы на SO; если вы застряли, опубликуйте минимально воспроизводимый пример вашей попытки, отметив ввод и ожидаемый результат, желательно в Stacksnippet

mplungjan 21.12.2020 07:28

@Samridh Tuladhr, добавлен пример кода

pl-jay 21.12.2020 07:36
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
1
3
4 246
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку функция, которая передается свойству onChange поля ввода, вызывается каждый раз, когда вы печатаете на клавиатуре. Вы можете проверить внутри этой функции, прежде чем выполнять какие-либо изменения, которые вам нужны для обновления состояния. Если значение длины event.target.value больше или равно 3, как это

filterList: function(event){
    if (event.target.value.length >= 3) {
       // Here you can perform what you need
    }   
}

Изменена ваша функция filterList, чтобы начать поиск только тогда, когда доступно 3 символа, в противном случае возвращайте список initialItems:

filterList: function(event){
    if (event.target.value.length > 2){
    var updatedList = this.state.initialItems;
    updatedList = updatedList.filter(function(item){
      return item.toLowerCase().search(
        event.target.value.toLowerCase()) !== -1;
    });
    this.setState({items: updatedList});
    }
    else{
      console.info(this.state.initialItems)
      this.setState({items: this.state.initialItems})
    }
  }

Обновлено: предыдущий ответ, опубликованный здесь, делает то же самое, что и я. Я добавил дополнительное условие else, чтобы вернуть весь список, когда в строке поиска ничего нет. Пожалуйста, измените его на else if в соответствии с вашими требованиями.

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

OnChange срабатывает всякий раз, когда происходит event. Поэтому, когда тег even.target.value как значения input изменяется, функция активируется. В отличие от других методов, таких как onClick или onSubmit, которые активируются после нажатия или нажатия кнопки отправки, каждое изменение обнаруживается событием onChange. Вот как отличается между onChange и onClick. Если вы хотите выполнить поиск после ввода 3 букв, есть простой способ. Условие установки value.length >= 3 было бы полезно.

Https://codepen.io/jacobkim9881/pen/LYRjLwd

Даже если подумать, это кажется прямолинейным, но как только пользователь очистит поле, мы должны вернуть исходный список выбранных элементов, чего здесь нет :) в вашем коде еще codepen.io/jacobkim9881/pen/LYRjLwd

Imran Rafiq Rather 21.12.2020 17:14

Как @Imran Rafiq Скорее, хороший разработчик React, любезно разъясненный выше, демонстрация выше :)

jacobkim 22.12.2020 07:04

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