不使用 React Hooks 的用法
与 Redux 核心和 Redux Toolkit 一样,RTK Query 的主要功能是与 UI 无关的,可以与任何 UI 层一起使用。RTK Query 还包含一个专门为 React 设计的 createApi
版本,它 自动生成 React Hooks.
虽然 React Hooks 是大多数用户预期使用 RTK Query 的主要方式,但库本身使用纯 JS 逻辑,可以与 React 类组件一起使用,也可以独立于 React 本身使用。
本页介绍了在不使用 React Hooks 的情况下如何与 RTK Query 交互,以便正确使用 RTK Query 的 缓存行为
.
添加订阅
缓存订阅用于告诉 RTK Query 它需要为某个端点获取数据。可以通过分发附加到查询端点的 initiate
thunk 操作创建者返回的结果来添加某个端点的订阅。
使用 React hooks 时,此行为将在 useQuery
、useQuerySubscription
、useLazyQuery
和 useLazyQuerySubscription
中处理。
const promise = dispatch(api.endpoints.getPosts.initiate())
const { refetch } = promise
// interact with the cache in the same way as you would with a useFetch...() hook
const { data, isLoading, isSuccess /*...*/ } = await promise
移除订阅
移除缓存订阅对于 RTK Query 识别缓存数据不再需要是必要的。这允许 RTK Query 清理并移除旧的缓存数据。
分发查询端点的 initiate
thunk 操作创建者返回的结果是一个带有 unsubscribe
属性的 Promise。此属性是一个函数,当调用时,将移除相应的缓存订阅。
使用 React hooks 时,此行为将在 useQuery
、useQuerySubscription
、useLazyQuery
和 useLazyQuerySubscription
中处理。
// Adding a cache subscription
const promise = dispatch(api.endpoints.getPosts.initiate())
// Removing the corresponding cache subscription
promise.unsubscribe()
访问缓存数据和请求状态
可以使用查询端点的 select
函数属性创建选择器,并使用 Redux 状态调用它来访问缓存数据和请求状态信息。这提供了在调用时缓存数据和请求状态信息的快照。
endpoint.select(arg)
函数创建了一个新的选择器实例 - 它不是实际的选择器函数本身!
使用 React hooks 时,此行为将在 useQuery
、useQueryState
和 useLazyQuery
中处理。
const result = api.endpoints.getPosts.select()(state)
const { data, isSuccess, isError, error } = result
请注意,与自动生成的 hooks 不同,没有 isFetching
标志,并且如果状态为 pending,无论是否已有数据,isLoading
标志都将为 true。
记忆化
由于 endpoint.select(arg)
函数每次调用都会返回一个新的选择器,并且由于此实例本身已记忆化,因此记忆化选择器的创建可能很有用(例如,然后在另一个选择器中使用该记忆化实例)。这可以使用 createSelector
完成。
const createGetPostSelector = createSelector(
(id: string) => id,
(id) => api.endpoints.getPost.select(id),
)
const selectGetPostError = createSelector(
(state: RootState) => state,
(state: RootState, id: string) => createGetPostSelector(id),
(state, selectGetPost) => selectGetPost(state).error,
)
执行变异
变异 用于更新服务器上的数据。变异可以通过调度附加到变异端点的 initiate
thunk 操作创建器结果来执行。
使用 React hooks 时,此行为将在 useMutation
中处理。
dispatch(api.endpoints.addPost.initiate({ name: 'foo' }))
示例
以下内容提供了不使用 React hooks 的使用示例:
React 类组件
示例 中的PostDetail
组件Svelte
示例- 以下
缓存生命周期订阅类组件
示例
更多信息
- NgRx 维护者 Brandon Roberts 撰写了一篇名为 Cousins playing nicely: Experimenting with NgRx Store and RTK Query 的文章,该文章演示了一些将 RTK Query 集成到 NgRx 的方法。
saulmoro/ngrx-rtk-query
实现了一个 NgRx 等效于 RTKQ 自身 React hooks 中管理的订阅生命周期。