RTKQ不使用hooks选取缓存数据 select()与select()(state)区别
select() 与 select()(state) 的核心差异 两者是RTKQ选择器柯里化调用的两个阶段,作用完全不同:
api.endpoints.getPosts.select():选择器生成函数,调用后不会直接返回缓存数据,返回值是一个标准Redux选择器函数。如果传入查询参数(比如select({ postId: 1 })),生成的选择器会自动匹配对应参数的缓存条目;不传参默认匹配无入参的查询缓存。这种柯里化设计是为了自动处理带参查询的缓存隔离,不需要手动写缓存键匹配逻辑。api.endpoints.getPosts.select()(state):调用的第二步,将Redux store的完整根state传入上一步生成的选择器,才会真正返回查询结果对象,包含你需要的data、status、error等字段。
state对象的传入方式
不需要在所有场景手动获取state,根据使用场景传参即可:
- React组件内配合
useSelector使用时,不需要手动传state,useSelector会自动把Redux根state注入给选择器:
import { useSelector } from 'react-redux' // 无参查询 const postsResult = useSelector(api.endpoints.getPosts.select()) const { data: posts, status } = postsResult // 带参查询,参数传入select()即可 const postDetail = useSelector(api.endpoints.getPost.select({ postId: 1 }))
- 组件外、thunk/自定义中间件等场景使用时,从store实例或thunk的
getState方法拿到根state传入即可:
// 比如thunk逻辑中 export const handlePostOperation = () => async (dispatch, getState) => { const rootState = getState() // 传入根state拿缓存 const postsCache = api.endpoints.getPosts.select()(rootState) // 后续业务逻辑 }
访问RTKQ缓存的最优方案
根据使用场景选对应方式,不要强行用手动选择器:
- 常规React组件场景:优先用RTKQ自动生成的Query Hook(比如
useGetPostsQuery()),Hook会自动处理缓存订阅、数据拉取、重渲染触发、缓存垃圾回收逻辑,代码量最低,出错概率最小。 - 非Hook场景(工具函数、中间件、跨组件公共逻辑)读取缓存:用上述选择器方案即可。如果是组件内用
useSelector配合生成的选择器,建议把固定参数的选择器提到组件外,避免每次渲染重新生成选择器导致不必要的重渲染。 - 注意:手动调用选择器读缓存不会自动触发接口请求,也不会建立缓存订阅,如果对应接口从来没有通过Hook或者手动dispatch触发过请求,拿到的状态会是
uninitialized,data字段为undefined。
内容的提问来源于stack exchange,提问作者dev.tom
相关产品推荐
相关产品推荐

