#javascript #reactjs #react-query
#javascript #reactjs #react-запрос
Вопрос:
Я реализовал бесконечную прокрутку с помощью useInfiniteQuery из react-query v3. Но isLoading, isFetching всегда true после запроса первой страницы. И isFetchingNextPage всегда false . После начальной загрузки первой страницы запросы на следующую страницу выполняются с помощью fetchNextPage()
Это мой хук useContents.
const useContents = (params) => {
return useInfiniteQuery(
['contents', params.Section],
({ pageParam = 0 }) => fetchContents(pageParam, params), {
getNextPageParam: (lastPage, allPages) => {
if (lastPage.payload.size === PAGE_SIZE) return allPages.length;
return false;
},
refetchInterval: 60000,
staleTime: 60000,
}
);
};
И это fetchContents
const fetchContents = (pageParam, params) => {
return axios
.get(`${apiDomain}/contents`, {
params: {
Section: params.Section,
ViewType: params.ViewType,
Count: pageParam*PAGE_SIZE,
PageSize: PAGE_SIZE,
...params.questionSectionParam,
},
...generateAxiosOptions('GET'),
})
.then((res) => {
return {
message: res.data.message,
payload: fromJS(res.data.payload),
result: res.data.result,
status: res.status,
pageParam,
};
});
};
Я потратил часы, но не смог найти причину.
Ответ №1:
Оказывается, что это глупая ошибка. Я добавил прослушиватель событий прокрутки в ref, поступающий из реквизитов с пустым массивом. Ниже неправильный код и исправлен путем удаления пустого массива.
useEffect(() => {
!!contentListRef amp;amp; contentListRef.addEventListener('scroll', infiniteScroller, false);
return () => {
lastScrollTop = 0;
contentListRef.removeEventListener('scroll', infiniteScroller, false);
};
}, []); // <-- This empty array is the reason for this bug