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





Чтобы гарантировать доступ к самым последним данным после завершения мутации, вы можете использовать флаги 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, иначе компоненты реагирования не будут уведомлены просто об изменениях в кеше. Спасибо вам обоим :)
Запрос React не будет уведомлять об изменениях в кеше
queryClient.GetQueryData. Вам нужно использоватьuseQuery