Каковы детали реализации кэша react-bootstrap-typeahead?

#react-bootstrap-typeahead

#react-bootstrap-typeahead

Вопрос:

Я работаю в приложении, где мы используем компонент AsyncTypeahead из react-bootstrap-typeahead. Это работает замечательно, и мне нравится библиотека, но недавно мне было поручено автоматически выбирать верхний результат, если пользователь что-то вводит, а затем нажимает за пределами поля (так далее). Я добавил свою логику и во время тестирования заметил, что наша функция поиска вызывалась не всегда, когда я вводил тестовые данные в поле.

Прочитав документы, я нашел флаг useCache и понял, что по умолчанию для него установлено значение on, поэтому мы не всегда вызывали search . Переключение этого значения на false гарантирует, что мы вызываем наш поиск во всех случаях, и мой автоматический выбор работает без проблем (я выполняю некоторую проверку для автоматического выбора данных, которые заданы в нашей функции поиска, поэтому в этом случае два события связаны вместе).

Прежде чем я отправлю свои изменения в prod, я надеялся получить некоторую информацию о деталях того, как работает этот кеш, и когда мы решим, что кеш больше не «действителен», и необходимо выполнить новый поиск. Я в основном пытаюсь понять влияние отключения этого кэша, и я не вижу ничего конкретного в документах.

Любая помощь приветствуется!

Ответ №1:

React-bootstrap-typeahead имеет открытый исходный код, поэтому вы можете ознакомиться с исходным кодом, если хотите понять реализацию. Встроенный кэш очень прост: это просто простой объект, который добавляет пары ключ / значение, соответствующие строке запроса и результатам. Перед запуском поиска компонент проверяет объект, чтобы узнать, был ли уже отправлен текущий запрос, и если да, вернет кэшированный результат.

Ниже приведены соответствующие разделы:

 const cacheRef: { current: Cache } = useRef({});
const queryRef: { current: string } = useRef(props.defaultInputValue || '');

const handleSearch = useCallback((query: string) => {
  queryRef.current = query;

  if (useCache amp;amp; cacheRef.current[query]) {
    forceUpdate();
    return;
  }

  onSearch(query);
}, [forceUpdate, minLength, onSearch, useCache]);

useEffect(() => {
  if (!isLoading amp;amp; prevProps amp;amp; prevProps.isLoading amp;amp; useCache) {
    cacheRef.current[queryRef.current] = options;
  }
});
 

Комментарии:

1. Это здорово! У меня возникли проблемы с поиском того, где был реализован кэш, и я надеялся, что вы найдете этот вопрос. Я рассмотрю это, а также код и перейду оттуда. Спасибо! Редактировать: не похоже, что для кэша установлено какое-либо ограничение по времени или размеру, что полезно знать. Есть ли какая-либо логика / процесс для очистки этого кэша? Или он очищается во время события onBlur?