【问题标题】:Material-ui pagination using React hooks使用 React 钩子的 Material-ui 分页
【发布时间】:2021-06-08 15:25:36
【问题描述】:

我正在使用 API 来获取数据并将其呈现到卡片中。我想添加分页,为此我使用React Pagination component。 我每页渲染 9 张卡片,页码和卡片数量由 API url 确定。 问题是,当我单击分页按钮时,它似乎调用了两次 API,一次用于第一页,一次用于我请求的页面。我不确定我在这里做错了什么。

这是我获取数据并尝试更新页码的部分:

useEffect(() => {
   fetchBeerData(currentPage);
 }, [currentPage]);

 const fetchBeerData = async pageNumber => {
   try {
     const { data } = await axios.get(
       `https://api.punkapi.com/v2/beers?page=${pageNumber}&per_page=9`
     );
     console.log(data);
     setBeers(data);
   } catch (err) {
     console.log(err);
   }
 };

 const handlePageChange = e => {
   setCurrentPage(e.target.innerText);
   fetchBeerData(currentPage);
   console.log('page nr:', e.target);
 };

我将handlePageChange 函数作为道具传递给分页组件,如下所示:

<PaginationButtons
        handlePageChange={handlePageChange}
        page={currentPage}
      />

这是分页组件:

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Pagination from '@material-ui/lab/Pagination';

const useStyles = makeStyles(theme => ({
  root: {
    '& > *': {
      marginTop: theme.spacing(2),
    },
  },
}));

export const PaginationButtons = ({ handlePageChange }) => {
  const classes = useStyles();

  return (
    <div className={classes.root}>
      <Pagination
        count={10}
        hidePrevButton
        hideNextButton
        size='large'
        onChange={e => handlePageChange(e)}
      />
    </div>
  );
};

我也创建了一个代码框,这里是link

【问题讨论】:

    标签: reactjs pagination react-hooks material-ui react-state


    【解决方案1】:

    在您的 handlePageChange 上,您正在设置 currentPage 状态,触发 useEffect 调用 fetchBeerData(currentPage) 然后您再次调用 fetchBeerData (当前页)

     const handlePageChange = e => {
       setCurrentPage(e.target.innerText);
      // fetchBeerData(currentPage);
       console.log('page nr:', e.target);
     };
    

    【讨论】:

    • 哦,我明白了.. 但是我怎样才能让它不触发 useEffect 呢?如果我从依赖数组中删除 currentPage ,似乎我得到的是随机页面
    • 刚刚从您的 handlePageChange 中删除了这一行 fetchBeerData(currentPage)。它工作正常..此外,如果您不想在状态更改时触发 useEffect,那么只需将当前页面值直接发送到 fetchBeerData(e.target.innerText) 等获取并删除依赖数组。但简单的解决方案是从处理程序中删除 fetchbeerData()。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2020-02-16
    • 2021-08-04
    • 2021-01-27
    • 2020-11-18
    • 2022-01-24
    • 2019-10-23
    • 2021-09-10
    相关资源
    最近更新 更多