【发布时间】:2022-01-21 16:46:15
【问题描述】:
我想使用endpoint.select() 函数从缓存的RTK Query 数据中创建选择器,请参阅RTK Advanced Patterns。
文档明确指出,如果没有查询参数,您可以将 undefined 传递给select()(请参阅选择用户数据部分)。
但是,在我的情况下,除非我通过 initiate() 函数触发查询,否则这不起作用。另一方面,当从查询挂钩触发查询时,选择器无法检索缓存数据。
这里的不工作设置非常简单:
export const productsApi = createApi({
baseQuery: fetchBaseQuery({ baseUrl: API.ENDPOINTS.PRODUCTS }),
reducerPath: 'productsApi',
endpoints: (builder) => ({
listAllProducts: builder.query({
query: ()=>'/list',
}),
}),
});
export const { useListAllProductsQuery } = productsApi;
然后在 customHook 中我调用 useListAllProducts 钩子:
const {
data,
} = useListAllProductsQuery({skip:shouldSkip});
最后在选择器中:
export const selectProducts =
productsApi.endpoints.listAllProducts.select(); //undefined param as docs recommend
潜在的修复:(或者更像是一个 hacky 解决方法): 奇怪的是,我发现如果我将一个参数(又名 cacheKey)传递给 select 函数并将相同的 cacheKey 传递给查询钩子,突然之间星星对齐并且一切正常(尽管文档声明这不是必需的)。所以修改后的代码如下:
// in selector
export const selectProducts =
productsApi.endpoints.listAllProducts.select('products');
// in hook
const {
data,
} = useListAllProductsQuery('products');
我想知道是否有人可以就其工作原理提供一些智慧,或者更好的是 推荐在没有 cacheKey 的查询上使用 select 函数的最佳实践(因为文档似乎不正确或过时?)。
我还想指出,在没有参数的情况下调用select() 时,需要一个指示参数的打字稿警告表面。
【问题讨论】:
标签: react-hooks react-query rtk-query