У меня есть компонент-обертка вокруг панели поиска, который выбирает предложения при каждом нажатии клавиши, а затем выполняет поиск, когда выбрано предложение или пользователь нажимает ввод / поиск. После выбора значения поиска я хочу сохранить этот элемент поиска в локальном хранилище, чтобы показать его в фокусе, как в Google. Вот фрагмент моего компонента
export default function App() {
const [results, resultsLoading, resultsError, setParams] = useFetch();
const [suggestions, ,suggestionsError, setSuggestionsParams] = useFetch();
const [showSearchSuggestions, setShowSearchSuggestions] = useState<boolean>(true);
const [recentSearches, setRecentSearches] = useLocalStorage('recent_searches', []);
const [searchAttributes, setSearchAttributes] = useState<SearchAtrributesInterface>({
value: '',
fetchType: SEARCH_FETCH_TYPES.SUGGESTIONS
});
useEffect(() => {
const getSearchSuggestions = () => setSuggestionsParams(getAutoCompleteURL(searchAttributes.value));
const getSearchResults = () => {
setParams(getSearchURL(searchAttributes.value));
setShowSearchSuggestions(false);
};
if (searchAttributes.value) {
if (searchAttributes.fetchType === SEARCH_FETCH_TYPES.SUGGESTIONS) {
getSearchSuggestions();
} else {
getSearchResults();
setRecentSearches([searchAttributes.value, ...recentSearches])
}
}
}, [searchAttributes, setParams, setSuggestionsParams]);
return ( ... );
};
Это прекрасно работает, но затем я получаю предупреждение: React Hook useEffect has missing dependencies: 'recentSearches' and 'setRecentSearches'. Either include them or remove the dependency array react-hooks/exhaustive-deps
. После добавления этих двух в массив зависимостей я застреваю в бесконечном цикле, потому что, конечно, состояние recentSearches
устанавливается, вызывает его повторную визуализацию и так далее. Я хотел бы найти решение вместо добавления // eslint-disable-next-line
, потому что я чувствую, что что-то действительно не так, что я делаю. Кто-нибудь знает, что я мог бы сделать по-другому, чтобы предотвратить бесконечный цикл и предотвратить предупреждение линтера?