Redux Toolkit RTK Query 发送查询参数

2024-04-28

如何使用 Redux Toolkit RTK 查询将查询参数传递到 api?

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

const baseUrl = 'xxxxxxx';

export const postsApi = createApi({
  reducerPath: 'posts',
  baseQuery: fetchBaseQuery({ baseUrl }),
  endpoints: (builder) => ({
    getPostsByYear: builder.query({
      query: (start, end) => { // Why is 'end' always undefined???
        return {
          url: 'posts/',
          params: { start, end },
        };
      },
    }),
    getPosts: builder.query({
      query: () => 'posts/',
    }),

    getPostByID: builder.query({
      query: (name) => `posts/${name}`,
    }),
  }),
});

export const { useGetPostsQuery, useGetPostsByYearQuery, useGetPostByIDQuery } = postsApi;

当尝试从组件传递参数时,仅start价值似乎得到了认可。year由内的 select 元素更新<PostOptions/>成分。它正在使用useState钩。该值正确更新并且useGetPostsByYearQuery被称为但是end参数始终未定义。所以,看来我没有正确定义 api 端点。有什么建议吗?我想要它做的就是以表单发送请求http://xxx/posts?start=start&end=end.

我什至尝试过对字符串值进行硬编码end参数,例如useGetPostsByYearQuery(year, '2019'),但它仍然显示为undefined使用 api 回调,所以我错过了一些更基本的东西。

const Post = () => {
 
  const year = useSelector((state) => state.postOptions.year);
  const yearPlusOne = parseInt(year, 10) + 1;
  const { data, error, isLoading } = useGetPostsByYearQuery(year, yearPlusOne);

  return (
    <SafeAreaView style={styles.container}>
      <View style={styles.content}>
        <PostHeading />
        <PostOptions></PostOptions>
      </View>
    </SafeAreaView>
  );
};

export default Post;

The QueryArg是一个泛型类型。

interface EndpointDefinitionWithQuery<
  QueryArg,
  BaseQuery extends BaseQueryFn,
  ResultType
> {
  query(arg: QueryArg): BaseQueryArg<BaseQuery>
}

See 源代码 https://github.com/reduxjs/redux-toolkit/blob/master/packages/toolkit/src/query/endpointDefinitions.ts#L56.

来自文档定义查询端点 https://redux-toolkit.js.org/rtk-query/usage/queries#defining-query-endpoints:

If the query回调需要额外的数据来生成 URL,因此应将其编写为采用单个参数。如果需要传递多个参数,请将它们格式化为单个“选项对象”。

所以你可以声明泛型参数QueryArg键入:builder.query像这样的方法:

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

const baseUrl = 'xxxxxxx';

export const postsApi = createApi({
  reducerPath: 'posts',
  baseQuery: fetchBaseQuery({ baseUrl }),
  endpoints: (builder) => ({
    getPostsByYear: builder.query<any, { start: string; end: string }>({
      query: (arg) => {
        const { start, end } = arg;
        console.log('arg: ', arg);
        return {
          url: 'posts/',
          params: { start, end },
        };
      },
    }),
  }),
});

export const { useGetPostsByYearQuery } = postsApi;

并像这样传递查询参数:

import React from 'react';
import { useGetPostsByYearQuery } from './hooks';

export default function App() {
  const { data, error, isLoading } = useGetPostsByYearQuery({ start: '2019', end: '2021' });
  return <div>app</div>;
}

The log:

arg:  { start: '2019', end: '2021' }

版本:"@reduxjs/toolkit": "^1.6.0"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redux Toolkit RTK Query 发送查询参数 的相关文章

随机推荐

  • 为视频添加水印的命令

    我尝试在一个视频上添加水印 但 FFmpeg 命令不会执行 错误代码为 3037 我运行相同的代码来修剪视频 视频已成功修剪 因此没有问题inputpath or outputpath我也有ic watermark png在资产文件夹中 我
  • PHP7下如何安装mcrypt? Laravel 需要它

    由于 Laravel4 需要mcrypt扩展名 而PHP7好像没有mcrypt扩展 有什么解决方法可以解决这个问题吗 有同样的问题 PHP7 缺少 mcrypt 这对我有用 当询问时 保留本地 PHP 配置文件 sudo apt get u
  • 在 Xcode 12.0 中通过 Carthage 引入 iOS 框架

    我正在使用 Xcode 12 0 和 Carthage 0 35 0 当我这样做时Carthage bootstrap platform iOS or Carthage update platform iOS no use binaries
  • Tkinter:固定尺寸框架中的中心标签?

    我正在尝试创建一个固定大小的框架并在中心放置一个文本标签 我不知道为什么这不起作用 我希望框架位于主框架的左上角 因此指定了 NW 并且效果很好 但改变标签的粘贴方向没有任何作用 感谢帮助 self f Frame self master
  • iOS:“__connection_block_invoke_2 中出现错误:连接中断”,但应用程序仅使用 < 20 MB 内存

    一个只有一个视图控制器的简单应用程序 仅加载 5 行文本 会生成以下错误 error in connection block invoke 2 Connection interrupted 这个帖子 https stackoverflow
  • TESTNG 无法在类路径中找到类问题

    我们正在将 testng 与我们的应用程序集成 我为 ant build 创建了 testng xml 和 testngbuild xml 运行 ant build 时 它抛出 Cannot find class in classpath
  • R从原始数据生成二维直方图

    我有一些 2D x y 的原始数据 如下所示 我想从数据生成二维直方图 通常 将 x y 值划分为大小为 0 5 的 bin 并计算每个 bin 中出现的次数 同时针对 x 和 y 有什么办法可以做到这一点吗 gt df x y 1 4 2
  • 在多处理中出现异常时,我是否需要手动调用 pool.terminate ?

    看来以下两个片段具有相同的行为 def sqr a time sleep 1 2 print local format os getpid if a 20 raise Exception fff return a a pool Pool p
  • 如何缩小 Windows Phone 中的图像尺寸

    我正在尝试将我的应用程序移植到 Windows Phone 中 我必须在服务器上上传图像 所以它的尺寸很小为了上传我已经在Widows中成功完成了这件事 但问题是当我失败时 这是我的Windows应用程序代码 public void Com
  • 如何在(非 Android)Java 应用程序中检索 Firebase 数据?

    有没有办法将数据从 Firebase 检索到 Java 应用程序 我有一个 Android 应用程序 它将数据存储到 Firebase 数据库中 我需要在 Java 应用程序中读取该数据 我在网上搜索过 但没有找到明确的答案 不是浏览器的U
  • 错误:样式父级的资源类型“attr”无效

    将我的 Android 项目升级到 Studio 3 0 1 和 Gradle 3 0 后 我在构建过程中遇到了一个问题 MAFLogonUI 3 15 6 aar 46f903e9d58266c453b893b9caa03deb res
  • 如何转换该对象数组?

    我有个问题 我有该对象数组 const iHaveThis question What s your name answer dda form filled key 15 question What s your e mail answer
  • 查找每个 pandas 数据帧行中前 n 个最高值列的名称

    我有以下数据框 id p1 p2 p3 p4 1 0 9 1 4 2 0 2 3 4 3 1 3 10 7 4 1 5 3 1 5 2 3 7 10 我需要以一种方式重塑数据框 对于每个 id 来说 它将具有具有最高值的前 3 列 结果会是
  • 有条件跳过 TestNG 测试

    我对 TestNG 注释没有太多经验 但是我正在尝试使用 TestNG 框架和 POM 设计模式为零售网站构建测试套件 我计划使用数据驱动的方法 我的计划是通过 Excel 驱动我的测试场景 而不是使用 testng xml 例如 我将拥有
  • 本地计算机的 Onenote API

    这是我在 Stackoverflow 上的第一篇文章 我正在寻找有关 OneNote API 的指导 我期待开发一个主要用于 自己使用 的解决方案 在我的本地计算机上创建 打开和关闭 OneNote 部分 不使用云等 请指导是否可以 我希望
  • 如何获取真实的屏幕高度和宽度?

    DisplayMetrics metrics new DisplayMetrics this getWindowManager getDefaultDisplay getMetrics metrics screenWidth metrics
  • 如何以 OO 风格打开管道?

    我用新风格重写了旧代码 如下所示 old style open FD file new style fh IO File gt new file r 文件没问题 但我不知道如何打开管道 read from pipes open PIPE s
  • dotnet 技术中的类库和安全性

    假设我已经开发了类库 并且我希望我只能在我的项目中使用这个库 但是如果有人尝试复制 dll 文件并想在他的项目中使用它 那么他将无法这样做 所以我只是想知道如何在 dll 文件中嵌入这种类型的安全性 请告诉我所有方法 谢谢 您可以在程序集中
  • Hibernate NoCacheRegionFactoryAvailableException

    我遇到了一个奇怪的 Hibernate 异常 我无法解释 它告诉我我正在使用二级缓存 但没有在哪里hibernate cfg xml我是否指定二级缓存 这是例外情况 org hibernate cache NoCacheRegionFact
  • Redux Toolkit RTK Query 发送查询参数

    如何使用 Redux Toolkit RTK 查询将查询参数传递到 api import createApi fetchBaseQuery from reduxjs toolkit query react const baseUrl xxx