我正在开发一个MERN堆栈应用程序,在那里我试图实现服务器端分页.

请注意,我正在使用Reaction查询来管理服务器状态.

在根路径上,我显示了两个帖子.

enter image description here

When I click on the Next button, NEXT two blog posts should be displayed. However, this is not happening. I see the same two posts on page 2 as on page 1. enter image description here

问题出在哪里?

我认为,要么是我的服务器端分页逻辑有问题,要么是Reaction查询有问题.我怀疑,当我单击Next按钮时,Reaction Query不是在获取博客文章;相反,它是从缓存中获取文章.(在这一点上,我可能错了).

以下是我的代码片段:

邮寄控制器s.js

const asyncHandler = require("express-async-handler");
const Post = require("../models/postModel");

const fetchAllPosts = asyncHandler(async (req, res) => {
  const { pageNumber } = req.body;
  const pageSize = 2;
  const postCount = await Post.countDocuments({});
  const pageCount = Math.ceil(postCount / pageSize);
  const posts = await Post.find({})
    .limit(2)
    .skip(pageSize * (pageNumber - 1));
  res.json({ posts, pageCount });
});

PostRoutes.js

const express = require("express");

const { fetchAllPosts, createPost } = require("../controllers/postControllers");

const router = express.Router();

router.get("/api/posts", fetchAllPosts);

module.exports = router;

Posts.js

import React, { useState } from "react";
import { useFetchAllPosts } from "../hooks/postsHooks";
import Spinner from "../sharedUi/Spinner";

const Posts = () => {
  const [pageNumber, setPageNumber] = useState(1);

  const { data, error, isLoading, isError } = useFetchAllPosts(pageNumber);

  const handlePrevious = () => {
    setPageNumber((prevPageNum) => prevPageNum - 1);
  };
  const handleNext = () => {
    setPageNumber((prevPageNum) => prevPageNum + 1);
  };
  return (
    <div>
      {isLoading ? (
        <Spinner />
      ) : isError ? (
        <p>{error.message}</p>
      ) : (
        data.posts.map((post) => (
          <p className="m-6" key={post.title}>
            {post.title}
          </p>
        ))
      )}
      <div>
        {isLoading ? (
          <Spinner />
        ) : isError ? (
          <p>{error.message}</p>
        ) : (
          <div className="flex justify-between m-6 w-60">
            <button
              disabled={pageNumber === 1}
              className="bg-blue-400 px-1 py-0.5 text-white rounded"
              onClick={handlePrevious}
            >
              Previous
            </button>
            <p>{data.pageCount && `Page ${pageNumber} of ${data.pageCount}`}</p>
            <button
              disabled={pageNumber === data.pageCount}
              className="bg-blue-400 px-1 py-0.5 text-white rounded"
              onClick={handleNext}
            >
              Next
            </button>
          </div>
        )}
      </div>
    </div>
  );
};

export default Posts;

PostHooks.js

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { useNavigate } from "react-router-dom";
import axios from "axios";

export const useFetchAllPosts = (pageNumber) => {
  const response = useQuery(["posts"], async () => {
    const { data } = await axios.get("/api/posts", pageNumber);
    return data;
  });

  return response;
};

推荐答案

查询的所有依赖项(=查询函数中使用的所有内容)都需要是查询键的一部分.Reaction查询将仅在键更改时触发自动提取:

export const useFetchAllPosts = (pageNumber) => {
  const response = useQuery(["posts", pageNumber], async () => {
    const { data } = await axios.get("/api/posts", pageNumber);
    return data;
  });

  return response;
};

为了避免在分页之间硬加载状态,您可能希望设置keepPreviousData: true

另请参阅:

Reactjs相关问答推荐

更新数据时有关CQR和更新UI的问题

如何使用Reducer更新全局变量

使用useReducer时,props 未从父级传递给子或孙级

有没有办法让两个状态在两次精准渲染中更新?

在一个blog函数中调用setState钩子

单击空白区域时,Reaction Multiple下拉组件不关闭

TypeError:SearchProduct.get()获得了意外的关键字参数查询'

react 路由GUGUD Use Effect无法通过useNavigate正常工作

XChaCha20-Poly1305的解密函数

使用下一步中的路由/导航不会立即加载路由

梅X折线图无响应

在reduce()方法上得到NaN

React router v5 仅在生产中不适用于嵌套路由

@react-three/postprocessing 没有匹配的从 three.module.js 导出以导入WebGLMultisampleRenderTarget

动态添加或删除文本输入字段并将值设置为 React JS 中主要状态的数组

当我在 useEffect 中使用 useDispatch 时,我的组件继续渲染

更新 Next.js 路由查询更改的状态会导致无限循环

运行开发服务器时如何为 Vite 指定运行时目录

服务器端分页未按预期工作

如何在 NavBar 中设置动态标题