RTK Query中refetchOnMountOrArgChange重取触发参数指代问题
关于
refetchOnMountOrArgChange配置的两个疑问解答 疑问1:配置说明中的argument指代对象
文档中提到的argument特指传入查询Hook的查询参数,和组件props没有直接绑定关系。
判断逻辑完全以你调用查询Hook时传入的第一个参数为准,和组件自身的其他props无关:只有当你将组件props中的某个值作为查询参数传入Hook时,该props值的变化才会间接触发参数变更判断,本质上的判断依据始终是传入Hook的参数值,而非组件props本身。
举个实际使用示例:
// 定义查询接口 const api = createApi({ endpoints: (builder) => ({ getUserById: builder.query({ // 这里接收的id就是Hook传入的argument query: (id) => `/users/${id}` }) }) }) function UserProfile({ userId, theme }) { // 传入Hook的userId是被监听的argument,同属props的theme变化完全不会触发相关逻辑 const { data } = useGetUserByIdQuery(userId, { refetchOnMountOrArgChange: true }) return <div className={theme}>{data?.nickname}</div> }
疑问2:为何参数变更被列为该配置的重取触发条件
默认行为下,查询Hook参数变化生成新的缓存键(endpoint + 序列化后的参数)时,RTK Query只会在两种场景发起请求:
- 该缓存键对应的缓存条目不存在
- 该缓存键对应的缓存条目已超出设置的存活时间
如果新参数对应的缓存条目存在且仍在有效期内,框架会直接返回缓存数据,不会发起新的拉取请求。
而开启refetchOnMountOrArgChange后,只要参数发生变化,无论对应缓存是否存在、是否在有效期内,都会强制发起一次新的请求拉取最新数据,这就是配置将参数变更列为触发条件的核心原因——它覆盖了默认的缓存命中逻辑,保证参数切换时总能拿到最新的服务端数据,而不是可能过时的本地缓存。
补充:该配置除了传
true开启强制重取,还支持传入数字类型值(单位为秒),只有当对应缓存的存在时间小于传入的秒数时才会直接使用缓存,否则仍然触发重取,本质逻辑也是覆盖默认的缓存有效期判断。
内容的提问来源于stack exchange,提问作者Chong Lip Phang
相关产品推荐
相关产品推荐

