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

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

Я попробовал это

    const { data, isFetching} = useQuery({
        queryKey: ["key1", startDate, endDate],
        queryFn: () => getData(startDate, endDate),
        initialData: [],
    });

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

Как я могу это остановить! это также вызывает у меня проблемы, потому что я использую isFetching для отображения некоторого наложения загрузки, поэтому, хотя я ясно вижу, что данные уже отображены, мне все равно приходится ждать, и, наконец, вызов API немного дороже на сервере, поэтому я не не хочу получать, если у меня уже есть кеш

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

const data = await queryClient.ensureQueryData({ queryKey, queryFn })

Таким образом, вы сначала проверяете кеш для данного ключа, и если ничего не найдено, вы запускаете функцию и возвращает результат.

Другой вариант может заключаться в том, чтобы создать собственный крючок, использующий getQueryData для чтения кеша, и если ничего не будет найдено, он вернет неопределенное значение, чтобы вы могли вызвать свой API, но я думаю, что это должно работать «из коробки» и достичь того же самого.

Это ссылка на всю документацию.

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

GeorgeSedhom 16.06.2024 19:02

здесь я подготовил вам небольшой пример: stackblitz.com/edit/… при первом нажатии на разные символы делается запрос к API, но при втором нажатии на тот же символ мы читаем кеш данные. Я использую queryClient.ensureQueryData вместе с useQuery, используя тот же queryKey для загрузки существующих данных, которые могут быть доступны в кеше, на случай, если их нет, мы получаем их из API, как обычно. Я также настроил кеш staleTime: Infinity на вечное использование, но вам следует настроить его под свои нужды.

jcobo1 16.06.2024 21:01

игнорировать неправильный tsconfig в моем проекте :)

jcobo1 16.06.2024 21:02

Спасибо большое, это очень красиво обрамляет

GeorgeSedhom 17.06.2024 03:29

useQuery с staleTime: Infinity здесь поможет. queryClient.ensureQueryData не обязательно.

TkDodo 27.07.2024 16:27

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

Вам нужно установить staleTime на Infinity, чтобы указать React Query никогда не извлекать данные, которые уже кэшированы.

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

QueryClient не установлен, используйте QueryClientProvider, чтобы установить его в useQueryClien. Ошибка при использовании реакцииQueryProvider
Становится ли изучение useEffect() менее важным для извлечения данных в React? Должны ли новички отдавать приоритет изучению React Query, а не useEffect()?
Условная выборка tRPC v10 с использованием useQuery и обязательными параметрами
Реакция-запрос: обнаружить первую выборку
Как имитировать только данные, за исключением другой информации (isLoading, isError и т. д.), возвращаемой из пользовательского перехватчика с помощью useQuery?
Запрос React не извлекает данные при изменении идентификатора в ключе запроса
После защиты маршрутов я застрял на странице входа, хотя вход прошел успешно
Проблема с пользовательской проверкой реакции-хука-формы
Бесконечный цикл повторов React-Query
Как обнаружить и запустить мой код, когда исходные данные извлекаются из useQuery()