Material-ui 使用 React hooks 分页
Material-ui pagination using React hooks
我正在使用 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
函数作为 prop 传递给分页组件,如下所示:
<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>
);
};
我也创建了一个codesandbox,这里是link
在您的 handlePageChange 上,您正在设置 currentPage 状态,触发 useEffect 调用 fetchBeerData(currentPage) 那么你又在调用 fetchBeerData(currentPage)
const handlePageChange = e => {
setCurrentPage(e.target.innerText);
// fetchBeerData(currentPage);
console.log('page nr:', e.target);
};
我正在使用 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
函数作为 prop 传递给分页组件,如下所示:
<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>
);
};
我也创建了一个codesandbox,这里是link
在您的 handlePageChange 上,您正在设置 currentPage 状态,触发 useEffect 调用 fetchBeerData(currentPage) 那么你又在调用 fetchBeerData(currentPage)
const handlePageChange = e => {
setCurrentPage(e.target.innerText);
// fetchBeerData(currentPage);
console.log('page nr:', e.target);
};