RTK查询中useQuery和initiate有什么区别?

问题描述 投票:0回答:2

当我们在选择器内部时,为了不违反hooks的规则,我们可以使用RTK查询端点,如下所示:

1)使用查询

  const data = datsApi.endpoints.getData.useQuery(someProps)

2)发起

  const data = await dispatch(datsApi.endpoints.getData.initiate(someProps))
  const { data } = data

但是它们之间有什么区别,什么时候使用每个示例更好

reactjs redux rtk-query
2个回答
5
投票

initiate()
是一个 Redux async thunk,它触发使用该缓存键参数为该端点获取数据。

当组件安装或您将缓存键参数更改为挂钩时,

useQuery
挂钩会根据需要自动分派该 thunk,并且还包含
useSelector
调用以检索组件的缓存条目数据。

95% 的情况下,

useQuery
钩子就是您所需要的。

仅当您必须在组件外部或在其他命令式逻辑中触发请求时才需要

initiate()
thunk。


0
投票

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 函数,然后调度该函数。

© www.soinside.com 2019 - 2024. All rights reserved.