使用Redux RTK Query LazyQuery时遇报错:useLazyQuery不可迭代
问题描述
我希望在onSuccess函数中使用Redux RTK执行API请求并等待响应,此前用Axios实现毫无问题,但替换为RTK的LazyQuery时遇到了问题。
收到的异常:
useLazyQuery is not a function or its return value is not iterable
API定义
const linkAPI = overweightRTK.injectEndpoints({ tagTypes: ['Link'], endpoints: (builder) => ({ createLink: builder.mutation({ query: (body) => ({ url: `/links/`, method: 'POST', body, invalidatesTags: ['Link'] }) }) }), overrideExisting: false }); export const { useCreateLinkMutation} = linkAPI;
组件代码
const [trigger, result, lastPromiseInfo] = OverweightRTK.endpoints.createLink.useLazyQuery() const onSuccess = async (data) => { const createLinkRequest = { payload: data }; trigger({ createLinkRequest }, { skip: !isSubscriber }) .unwrap() .then(res => { if (res.status === 200) { setSuccessMessage('Success, your account linked'); } }) .catch((error) => console.log(error)); };
解决方案
- 根本问题:你在API里定义的是Mutation(用于POST这类修改数据的请求),但组件里错误使用了
useLazyQuery——RTK Query中,Query对应GET类查询请求,Mutation对应POST/PUT/DELETE类修改请求,两者的Hook不能混用。 - 修正方案:直接使用你已经导出的
useCreateLinkMutationHook,而非调用endpoints.createLink.useLazyQuery
修正后的组件代码:
// 导入已导出的Mutation Hook import { useCreateLinkMutation } from './你的API文件路径'; const YourComponent = () => { // useCreateLinkMutation 返回 [触发函数, 请求状态对象] const [createLink, { isLoading, error }] = useCreateLinkMutation(); const onSuccess = async (data) => { // 非订阅者直接跳过请求 if (!isSubscriber) return; const createLinkRequest = { payload: data }; try { const res = await createLink(createLinkRequest).unwrap(); // RTK会自动解析响应,无需额外判断status===200 setSuccessMessage('Success, your account linked'); } catch (error) { console.log(error); } }; // 组件其他逻辑... };
补充说明
useLazyQuery是Query类型请求的专属Hook,用于延迟触发GET查询,你的createLink是POST请求,必须用对应的Mutation Hookunwrap()方法会直接返回响应数据或抛出请求错误,用async/await写法比.then/.catch更简洁- Mutation Hook不支持
skip参数,跳过请求的逻辑直接在调用前判断即可
内容的提问来源于stack exchange,提问作者TrollBearPig
相关产品推荐
相关产品推荐

