React Query не выполняет повторную визуализацию после setQueryData

Я новичок в реагировании на запросы, но я пытаюсь реализовать следующее: Выполнить мутацию -> Кэшировать данные ответа -> получить доступ к данным по ключу.

Компонент, которому я хочу получить доступ к данным:

function Test() {
  const client = useQueryClient()
  const bla = client.getQueryData(['auth'])

  console.info('blaa', bla)

  return (
    <div>
      <TestInsideTest />
    </div>
  )
}

Компонент, выполняющий мутацию:

function TestInsideTest() {
  const loginMutation = useLoginMutation()

  return (
    <div>
      I am the test inside test press the button <br />
      <button onClick = {() => loginMutation.mutate()}>Do fetch</button>
    </div>
  )
}

Мутация:

export const useLoginMutation = () => {
  const queryClient = useQueryClient()

  return useMutation({
    mutationFn: () => Promise.resolve({ access_token: '123' }),
    onSuccess: (data: { access_token: string }) => {
      queryClient.setQueryData(['auth'], data)
    },
  })
}

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

Вы можете протестировать это здесь: https://codesandbox.io/p/sandbox/react-query-forked-x358vl?file=%2Fsrc%2FTest.tsx%3A8%2C27

Запрос React не будет уведомлять об изменениях в кеше queryClient.GetQueryData. Вам нужно использовать useQuery

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

Ответы 1

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

Чтобы гарантировать доступ к самым последним данным после завершения мутации, вы можете использовать флаги isFetching или isSuccess, предоставляемые React Query.

import { useQueryClient, useQuery, useMutation } from 'react-query';

function Test() {
  const client = useQueryClient();
  const { data: authData, isSuccess } = useQuery(['auth']);

  console.info('blaa', authData);

  return (
    <div>
      {isSuccess && (
        <div>
          Auth Data: {authData.access_token}
        </div>
      )}
      <TestInsideTest />
    </div>
  );
}

function TestInsideTest() {
  const loginMutation = useLoginMutation();

  return (
    <div>
      I am the test inside test press the button <br />
      <button onClick = {() => loginMutation.mutate()}>Do fetch</button>
    </div>
  );
}

export const useLoginMutation = () => {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: () => Promise.resolve({ access_token: '123' }),
    onSuccess: (data: { access_token: string }) => {
      queryClient.setQueryData(['auth'], data);
    },
  });
};

Принятие этого на основе ответа @quyentho. Вы должны использовать useQuery, иначе компоненты реагирования не будут уведомлены просто об изменениях в кеше. Спасибо вам обоим :)

Nick Gr 05.04.2024 13:00

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