当我们在选择器内部时,为了不违反hooks的规则,我们可以使用RTK查询端点,如下所示:
1)使用查询
const data = datsApi.endpoints.getData.useQuery(someProps)
2)发起
const data = await dispatch(datsApi.endpoints.getData.initiate(someProps))
const { data } = data
但是它们之间有什么区别,什么时候使用每个示例更好
initiate()
是一个 Redux async thunk,它触发使用该缓存键参数为该端点获取数据。
当组件安装或您将缓存键参数更改为挂钩时,
useQuery
挂钩会根据需要自动分派该 thunk,并且还包含 useSelector
调用以检索组件的缓存条目数据。
95% 的情况下,
useQuery
钩子就是您所需要的。
仅当您必须在组件外部或在其他命令式逻辑中触发请求时才需要
initiate()
thunk。
Redux 为我们提供了 thunk 中间件,它允许我们调度 thunk 函数。 Thunk 函数始终将dispatch 和getState 作为参数(也可以配置其他参数)。所以这里有两种情况:
案例一,调度动作对象
const actionObject = 调度(actionObject)
默认情况下,store.dispatch(action) 返回实际的操作对象。
案例二,调度thunk函数
您需要了解的第一件事是 thunk 函数和 thunk 动作创建器之间的区别。这里定义得很好,writing-thunks,还有一个小片段:
// fetchTodoById is the "thunk action creator"
export function fetchTodoById(todoId) {
// fetchTodoByIdThunk is the "thunk function"
return async function fetchTodoByIdThunk(dispatch, getState) {
const response = await client.get(`/fakeApi/todo/${todoId}`)
dispatch(todosLoaded(response.todos))
}
}
现在你可以使用
fetchTodoByIdThunk
调度 dispatch(fetchTodoByIdThunk)
或使用 fetchTodoById
调度 dispatch(fetchTodoById())
,它是相同的,但后者可以采取争论来进一步细化。 thunk 中间件将负责拦截传递给dispatch的这个函数,并以dispatch和getState作为参数来调用这个函数。
我发现他们使用 thunk
这个词来形容 thunk 动作创作者。您可以在上面关于编写 thunk 的代码片段之后看到它(请参阅下一个代码片段的标题)。从所有这些信息中,我唯一想到的是 datsApi.endpoints.getData.initiate
返回一个 thunk 动作创建器,当调用它时返回 thunk 函数,然后调度该函数。