11. React 查询 - 分页列表

本文介绍了如何在React应用中利用ReactQuery轻松实现列表的分页功能。通过创建状态保存当前页面和每页元素数量,以及监听状态变化来获取数据,简化了分页列表的构建过程。使用ReactQuery,只需在useQuery中处理好查询键和参数,即可方便地实现分页。

嘿伙计,

今天是学习如何使用 ReactQuery 对列表进行分页的时候了。

如果您在应用程序中构建列表,通常会创建列表分页以改进平台的用户界面,但也会限制 API 中的工作。

使用 ReactQuery,构建分页列表是小菜一碟。

您必须遵循 3 个步骤:

创建状态保存当前页面的值

创建一个状态来保存页面的限制(每页上的元素数量)

每次用户更改先前状态之一时获取数据。

但是让我们看一个更容易理解的例子

const fetchTodos = async (
  page: number,
  limit: number,
  signal: AbortSignal | undefined
): Promise<{
  totals: number;
  todos: Todo[];
}> => {
  const response = await fetch(`api/tasks?_page=${page}&_limit=${limit}`, {
    signal,
  });
  if (!response.ok) {
    throw new ResponseError('Failed to fetch todos', response);
  }
  const todos: Todo[] = await response.json();
  const totals = Number.parseInt(
    response.headers.get('x-total-count') || '0',
    10
  );

  return {
    totals,
    todos,
  };
};

interface UseTodos {
  todos: Todo[];
  isLoading: boolean;
  isFetching: boolean;
  error?: string;
  pages: number;
  page: number;
  setPage: Dispatch<SetStateAction<number>>;
}

export const useTodos = (): UseTodos => {
  const [page, setPage] = useState<number>(1);
  const [limit] = useState<number>(5);

  const {
    data: { todos, totals } = {
      todos: [],
      totals: 0,
    },
    isLoading,
    isFetching,
    error,
  } = useQuery(
    [QUERY_KEY.todos, page, limit],
    ({ signal }) => fetchTodos(page, limit, signal),
    {
      refetchOnWindowFocus: false,
      retry: 2,
    }
  );

  return {
    todos,
    isLoading,
    isFetching,
    error: mapError(error),
    pages: Math.ceil(totals / limit),
    page,
    setPage,
  };
};

正如您所注意到的,使用 ReactQuery 构建分页的过程非常简单。

获取请求必须包含页面和限制(如果需要,您也可以使用限制和偏移量来处理分页)并且在您的页面中useQuery您必须处理一些简单的东西。首先,您的查询键也必须包含页面和限制,其次您必须将页面和限制传递给您的获取请求。

如您所见,使用 ReactQuery 构建分页列表真的是小菜一碟.

如果你喜欢我的文章,记得关注获取更多的信息。感谢您的阅读,祝您有美好的一天!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q shen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值