【问题标题】:Approaches for using RTK-Query hooks inside functions?在函数中使用 RTK-Query 钩子的方法?
【发布时间】:2021-11-04 19:29:46
【问题描述】:

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

如何利用这些 rtk-hooks(以及一般的挂钩),以便将它们与 onClickonSubmit 和条件事件等行为联系起来?我知道这种冲突使用rules-of-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;

使用 axios 的通用示例:

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

【问题讨论】:

    标签: reactjs redux react-hooks redux-toolkit rtk-query


    【解决方案1】:

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

    例如:

    我用这个来登录:

    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 === '',
    })
    

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

    【讨论】:

      【解决方案2】:

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

      const [myState, setState] = useState(skipToken) // initialize with skipToken to skip at first
      const result = useMyQuery(myState)
      

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

      const changePage = () => {
        setState(5)
      }
      

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

      const [trigger, result] = useMyMutation()
      

      这样称呼

      const handleSubmit = () => {
        trigger(someValue)
      }
      

      【讨论】:

      • 谢谢 phry,rtk-query 是一个非常简洁的工具,您已经完成了一些伟大的工作!
      • 这太棒了,谢谢。我想向其他阅读本文并挠头的人指出,skipToken 是从 RTKQ 导入的:import { skipToken } from "@reduxjs/toolkit/query";
      • 感谢您的回答。这是一般惯例吗?
      • @philipjc this 或 useLazyQuery,两者都是有效的。
      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多