使用React MUI库实现用户列表分页功能
分页加载
使用 MUI(Material-UI)库可以方便地构建一个用户列表分页功能。以下是一个简单的示例代码,其中包含了用户信息的展示,包括 Icon、性别、名字和邮箱。
import React, { useState } from 'react'; import { Grid, Typography, Container, Pagination, Avatar, makeStyles } from '@material-ui/core'; import { Email, Person } from '@material-ui/icons'; const useStyles = makeStyles((theme) => ({ container: { marginTop: theme.spacing(2), }, userItem: { display: 'flex', alignItems: 'center', marginBottom: theme.spacing(2), }, avatar: { marginRight: theme.spacing(2), }, })); const UserListPage = () => { const classes = useStyles(); const [currentPage, setCurrentPage] = useState(1); const usersPerPage = 10; // 每页显示的用户数量 const users = [ { id: 1, name: 'Alice', gender: 'Female', email: 'alice@example.com' }, { id: 2, name: 'Bob', gender: 'Male', email: 'bob@example.com' }, // 其他用户信息 ]; // 计算总页数 const totalPages = Math.ceil(users.length / usersPerPage); // 处理页码变更 const handlePageChange = (event, value) => { setCurrentPage(value); }; // 根据当前页码和每页用户数量计算需要展示的用户列表 const startIndex = (currentPage - 1) * usersPerPage; const endIndex = startIndex + usersPerPage; const usersToShow = users.slice(startIndex, endIndex); return ( <Container className={classes.container}> {usersToShow.map((user) => ( <div key={user.id} className={classes.userItem}> <Avatar className={classes.avatar}> <Person /> </Avatar> <div> <Typography variant="body1">{user.name}</Typography> <Typography variant="body2">{user.gender}</Typography> <Typography variant="body2"> <Email fontSize="small" /> {user.email} </Typography> </div> </div> ))} <Grid container justifyContent="center"> <Pagination count={totalPages} page={currentPage} onChange={handlePageChange} variant="outlined" shape="rounded" /> </Grid> </Container> ); }; export default UserListPage;
以上代码通过使用 MUI 的 Grid、Typography、Container、Pagination 和 Avatar 等组件来实现一个简单的用户列表分页功能,其中包含了 Icon、性别、名字和邮箱的展示。
无限滚动
使用 MUI(Material-UI)库可以很方便地实现用户列表的无限滚动(Infinite Scroll)功能。无限滚动是一种在用户滚动到页面底部时自动加载更多数据的方式,从而实现流畅的加载体验,避免一次性加载大量数据导致页面性能下降。
以下是一个简单的示例代码,使用 MUI 的 Grid、Typography、Container、IconButton 等组件,结合 React Hooks 的 useState 和 useEffect 实现用户列表的无限滚动功能。
import React, { useState, useEffect } from 'react'; import { Grid, Typography, Container, IconButton, CircularProgress, makeStyles, } from '@material-ui/core'; import { Email, Person } from '@material-ui/icons'; const useStyles = makeStyles((theme) => ({ container: { marginTop: theme.spacing(2), }, userItem: { display: 'flex', alignItems: 'center', marginBottom: theme.spacing(2), }, avatar: { marginRight: theme.spacing(2), }, loadingContainer: { textAlign: 'center', }, })); const UserListInfiniteScroll = () => { const classes = useStyles(); const [users, setUsers] = useState([]); const [isLoading, setIsLoading] = useState(false); const [currentPage, setCurrentPage] = useState(1); const usersPerPage = 10; // 每页显示的用户数量 // 模拟异步加载用户数据 const fetchUsers = async () => { setIsLoading(true); // 模拟异步加载用户数据 const response = await new Promise((resolve) => setTimeout(() => resolve(getMockUsers()), 1000)); setUsers([...users, ...response]); setCurrentPage(currentPage + 1); setIsLoading(false); }; useEffect(() => { fetchUsers(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // 模拟获取用户数据 const getMockUsers = () => { const startIndex = (currentPage - 1) * usersPerPage; const endIndex = startIndex + usersPerPage; const mockUsers = [ { id: 1, name: 'Alice', gender: 'Female', email: 'alice@example.com' }, { id: 2, name: 'Bob', gender: 'Male', email: 'bob@example.com' }, // 其他用户信息 ]; return mockUsers.slice(startIndex, endIndex); }; // 处理滚动到页面底部时加载更多数据 const handleScroll = (event) => { const { scrollTop, clientHeight, scrollHeight } = event.currentTarget; if (scrollTop + clientHeight >= scrollHeight - 20 && !isLoading) { fetchUsers(); } }; return ( <Container className={classes.container} onScroll={handleScroll}> {users.map((user) => ( <div key={user.id} className={classes.userItem}> <Grid container spacing={2} alignItems="center"> <Grid item> <Person /> </Grid> <Grid item> <Typography variant="body1">{user.name}</Typography> <Typography variant="body2">{user.gender}</Typography> <Typography variant="body2"> <Email fontSize="small" /> {user.email} </Typography> </Grid> </Grid> </div> ))} {isLoading && ( <div className={classes.loadingContainer}> <CircularProgress /> </div> )} </Container> ); }; export default UserListInfiniteScroll;
在上面的示例中,使用了 MUI 的 Grid 组件来布局用户列表项,使用 Typography 组件展示用户信息,使用 Container 组件作为容器,使用 IconButton 和 CircularProgress 组件展示加载状态。通过 useState 和 useEffect Hooks 来管理用户数据、加载状态以及页面滚动事件。当用户滚动到页面底部时,会触发 handleScroll 函数来加载更多用户数据,从而实现了用户列表的无限滚动功能。
需要注意的是,上面的示例代码中使用了模拟的异步加载用户数据的方式,实际项目中需要根据具体的后端 API 接口来加载真实的用户数据。同时,还需要根据具体需求对样式和逻辑进行调整和优化,例如加载状态的展示方式、滚动事件的节流处理等。
到此这篇关于使用React MUI库实现用户列表分页功能的文章就介绍到这了,更多相关React MUI库实现分页功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
React useContext与useReducer函数组件使用
useContext和useReducer 可以用来减少层级使用, useContext,可以理解为供货商提供一个公共的共享值,然后下面的消费者去接受共享值,只有一个供货商,而有多个消费者,可以达到共享的状态改变的目的2023-02-02React 错误边界Error Boundary使用示例解析
这篇文章主要为大家介绍了React 错误边界Error Boundary使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-09-09React render核心阶段深入探究穿插scheduler与reconciler
这篇文章主要介绍了React render核心阶段穿插scheduler与reconciler,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧2022-11-11React的createElement和render手写实现示例
这篇文章主要为大家介绍了React的createElement和render手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08
最新评论