Выполнение бэкэнд-поиска с помощью React Semantic Dropdown Rerenders при каждом нажатии клавиши

Итак, я реализовал раскрывающийся список с возможностью поиска и множественным выбором из response-semantic-ui. (https://react.semantic-ui.com/modules/dropdown/ )

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

Я хочу реализовать бэкэнд-поиск, который выполняется с помощью вызова axios с переменной searchQuery. Проблема в том, что каждый раз, когда нажимается клавиша, onSearchChange запускается для выполнения нового поиска, который повторно отображает раскрывающийся список, таким образом закрывая раскрывающийся список и очищая запрос.

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

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

const ParentComponent = () => {
const [options, setOptions] = useState()
const [searchString, setSearchString] = useState('')

 useEffect(() => {
    const fetchOptions = async (searchString) => {
    // getOptions is just an async axios.get, which returns an options array based on the search criteria
        const response = await getOptions(searchString)
        setOptions(response)
    }
    fetchOptions(searchString)
}, [searchString])

const handleSearchChange = (e, search) => {
    setSearchString(() => search.searchQuery)
}
return(
   <DropDown
      onSearchChange={handleSearchChange}
      searchQuery={searchString}
      options={options}
    />
)}

person Askholm    schedule 21.07.2020    source источник


Ответы (1)


следующее должно работать, я установил поиск свойство функции: search={() => options} и разрешить filterCountries только тогда, когда это был последний пользовательский ввод.

В этом примере, когда поиск состоит из одного символа, для разрешения потребуется 2 секунды, но в противном случае потребуется 500 миллисекунд. Итак, если я наберу a, а затем al есть 2 обещания, обещание al разрешится быстро и установит параметры, но позже обещание a разрешится и перезапишет параметры, если я не буду использовать last.

Я также добавил в код debounce и group, группа будет кэшировать результаты до перезагрузки страницы, вы можете кэшировать любым способом, заменив логику createCache.

person HMR    schedule 21.07.2020
comment
Ваш ответ заставил меня понять, что моя основная проблема заключалась в установке состояния searchString (или любых других состояний, если на то пошло) вне раскрывающегося компонента, заставило его повторно визуализироваться, что сделало его замкнутым на себе и потерявшим фокус. - person Askholm; 22.07.2020