防止缓存特定 RTK 查询端点
Prevent Caching on a specific RTK Query Endpoint
我正在使用 rtq 查询并且我有一个端点从全局存储中获取 azure-ad oid 并向后端查询以检查用户是否存在于后端以检查用户是否存在。如果用户存在,那么我将用户重定向到仪表板,否则我不重定向用户。
问题在于,尽管试图阻止该端点上的缓存,它仍然使用缓存的数据,并且当真正的数据来自服务器时,重定向已经发生。以下是我为防止这种情况发生而采取的一些步骤。
- 使用重新获取
- 设置 refetchOnMountOrArgChange: true,
- 设置 keepUnusedDataFor: 0.0001 几乎立即使缓存失效
关键是我不希望此端点使用任何缓存数据。
下面是我的组件:
const [isSignedIn] = useIsSignedIn();
const history = useHistory();
const dispatch = useAppDispatch();
const ongraphLogin = async (role: string) => {
if (Providers.globalProvider.login) {
dispatch(setloginType(role));
await Providers.globalProvider.login();
}
};
const userState = useAppSelector(state => state.userState);
console.log(userState?.currentUser?.id);
const { data, error, isLoading, refetch } = useGetUserByOidQuery(userState?.currentUser?.id, {
skip: isSignedIn,
refetchOnMountOrArgChange: true
});
useEffect(() => {
refetch();
// console.log(res);
if (isSignedIn) {
console.log('I am in');
// Check if the user exists in the ndovysystem
if (data?.status === 'success') {
console.log(data);
history.push('/user');
} else if (userState.loginType === 'volunteerRegistration') {
history.push('/register/volunteer');
} else if (userState.loginType === 'menteeRegistration') {
history.push('/register/mentee');
}
}
}, [isSignedIn, data]);
下面是终点
import { ndovuAPI } from './ndovuAPI';
export const ndovuUserAPI = ndovuAPI.injectEndpoints({
endpoints: builder => ({
getUserByOid: builder.query({
query: (oid: string) => `/users/oid/${oid}`,
keepUnusedDataFor: 0.0001
})
})
});
// Export hooks for usage in functional components
export const { useGetUserByOidQuery} = ndovuUserAPI;
请帮我解决这个问题。
嗯。你不能真正阻止查询缓存,但你可以使它成为一个突变——默认情况下,即使两个具有相同参数的突变也永远不会共享一个缓存条目。
您可以将时间戳作为查询的参数传递。这就是我为防止在安装组件时缓存所做的。
像这样
const timestampRef = useRef(Date.now()).current;
const {data = [], isFetching}
= useGetChatMessagesQuery({id: chatId, lastMessageId, sessionId: timestampRef});
我正在使用 rtq 查询并且我有一个端点从全局存储中获取 azure-ad oid 并向后端查询以检查用户是否存在于后端以检查用户是否存在。如果用户存在,那么我将用户重定向到仪表板,否则我不重定向用户。
问题在于,尽管试图阻止该端点上的缓存,它仍然使用缓存的数据,并且当真正的数据来自服务器时,重定向已经发生。以下是我为防止这种情况发生而采取的一些步骤。
- 使用重新获取
- 设置 refetchOnMountOrArgChange: true,
- 设置 keepUnusedDataFor: 0.0001 几乎立即使缓存失效
关键是我不希望此端点使用任何缓存数据。
下面是我的组件:
const [isSignedIn] = useIsSignedIn();
const history = useHistory();
const dispatch = useAppDispatch();
const ongraphLogin = async (role: string) => {
if (Providers.globalProvider.login) {
dispatch(setloginType(role));
await Providers.globalProvider.login();
}
};
const userState = useAppSelector(state => state.userState);
console.log(userState?.currentUser?.id);
const { data, error, isLoading, refetch } = useGetUserByOidQuery(userState?.currentUser?.id, {
skip: isSignedIn,
refetchOnMountOrArgChange: true
});
useEffect(() => {
refetch();
// console.log(res);
if (isSignedIn) {
console.log('I am in');
// Check if the user exists in the ndovysystem
if (data?.status === 'success') {
console.log(data);
history.push('/user');
} else if (userState.loginType === 'volunteerRegistration') {
history.push('/register/volunteer');
} else if (userState.loginType === 'menteeRegistration') {
history.push('/register/mentee');
}
}
}, [isSignedIn, data]);
下面是终点
import { ndovuAPI } from './ndovuAPI';
export const ndovuUserAPI = ndovuAPI.injectEndpoints({
endpoints: builder => ({
getUserByOid: builder.query({
query: (oid: string) => `/users/oid/${oid}`,
keepUnusedDataFor: 0.0001
})
})
});
// Export hooks for usage in functional components
export const { useGetUserByOidQuery} = ndovuUserAPI;
请帮我解决这个问题。
嗯。你不能真正阻止查询缓存,但你可以使它成为一个突变——默认情况下,即使两个具有相同参数的突变也永远不会共享一个缓存条目。
您可以将时间戳作为查询的参数传递。这就是我为防止在安装组件时缓存所做的。
像这样
const timestampRef = useRef(Date.now()).current;
const {data = [], isFetching}
= useGetChatMessagesQuery({id: chatId, lastMessageId, sessionId: timestampRef});