Redux Toolkit RTK Query отправка параметров запроса

Как передать параметры запроса в api с помощью Redux Toolkit RTK 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({
      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 обновляется элементом выбора в <PostOptions/>составная часть. Он использует useStateкрюк. Значение обновляется правильно и useGetPostsByYearQueryвызывается, но параметр всегда не определен. Итак, похоже, я неправильно определяю конечную точку 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;

1 ответ

Это универсальный тип. См. Исходный код.

Таким образом, вы можете объявить общий параметр 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>;
}

Журнал:

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

версия: "@reduxjs/toolkit": "^1.6.0"

Другие вопросы по тегам