在函数内部使用 RTK-Query 挂钩的方法?

kev*_*vin 25 reactjs redux react-hooks redux-toolkit rtk-query

我已经使用 Axios 成功编写了我的应用程序来获取内容。截至目前,它已设置为在发生某些事件时获取内容(例如单击提交按钮)。但是,我正在尝试Redux 的 RTK 查询解决方案。该包生成挂钩,并在其示例中提供了在挂载时调用挂钩的简单组件级示例。

我如何利用这些 rtk-hook(以及一般的钩子),以便将它们与 、 和条件事件等行为联系onClick起来onSubmit我知道这与hooks 规则准则相冲突,但我无法想象 RTK-Query 会受到如此限制,只允许组件级 onMount API 调用。

当我试图解决这个问题/等待一个有用的例子时,我正在阅读一些相关文章:

第二篇文章似乎有些相关,但我觉得它偏离了道路太远,并且正在质疑它是否值得rtk-query安装。我不妨只使用它axios,因为它可以在我的组件和逻辑中的任何地方使用。有人可以教育我如何解决这个问题吗?我是 rtk-query 的新手,它看起来真的很酷,但它的实现方法似乎也确实受到限制。

这是我的切片的示例api.ts

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

const apiEndpoint = 'http://localhost:5000';

export const myApi = createApi({
  reducerPath: 'myApi',
  baseQuery: fetchBaseQuery({ baseUrl: apiEndpoint }),
  endpoints: builder => ({
    getFileById: builder.query<any, { id: string; fileId: string }>({
      query: arg => {
        const { id, fileId } = arg;
        return `/service/${id}/files/${fileId}`;
      },
    }),
  }),
});

// RTK Query will automatically generate hooks for each endpoint query
export const { useGetFileByIdQuery } = myApi;
Run Code Online (Sandbox Code Playgroud)

使用 axios 的通用示例:

const handleSubmit = async (): Promise<void> => {
    try {
      const getResponse = await axios.get('my-endpoint/abc/123');
    }
    catch (e) {
     ...
    }
}
Run Code Online (Sandbox Code Playgroud)

phr*_*hry 47

如果使用查询,则将使用本地组件状态来设置查询参数

import { skipToken } from "@reduxjs/toolkit/query";
const [myState, setState] = useState(skipToken) // initialize with skipToken to skip at first
const result = useMyQuery(myState)
Run Code Online (Sandbox Code Playgroud)

然后在您的点击处理程序中设置状态

const changePage = () => {
  setState(5)
}
Run Code Online (Sandbox Code Playgroud)

但就您而言,您有一个表单提交,听起来您想使用“突变”,而不是查询。突变的要点在于,您对长期结果并不真正感兴趣,而是希望通过发送数据来触发服务器上的更改。

const [trigger, result] = useMyMutation()
Run Code Online (Sandbox Code Playgroud)

那会被称为像

const handleSubmit = () => {
  trigger(someValue)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是惊人的,谢谢。我想向其他阅读本文并摸不着头脑的人指出,`skipToken` 是从 RTKQ 导入的:`import {skipToken } from "@reduxjs/toolkit/query";` (16认同)

Isr*_*ael 15

还有另一个选项可以传递布尔值作为查询的第二个参数。

例如:

我用它来登录:

const [email, setEmail] = useState<string>('')
const [password, setPassword] = useState<string>('')
const [loginCredentials, setLoginCredentials] = useState<ILoginRequest>({ email: '', password: '' })

const { data, error, isError, isSuccess, isLoading } = useLoginQuery(loginCredentials, {
    skip: loginCredentials.email === '' && loginCredentials.password === '',
})
Run Code Online (Sandbox Code Playgroud)

注意:组件加载时skip参数为false。当用户填写电子邮件和密码时,我正在设置电子邮件和密码状态。当按下登录按钮时,我设置了 loginCredentials 状态并触发 RTK 查询。