讲师中心 微信公众号
AI工具推荐 视频效率加速

React中实现动态分页卡片列表教程

陌晨君_8732

陌晨君_8732

发布时间:2025-07-22 15:12:01

|

433人浏览过

|

来源于php中文网

原创

React中实现动态分页卡片列表教程

本教程详细阐述了如何在React应用中构建一个动态、可分页的卡片列表组件。通过利用React的useState Hook管理当前页码,结合JavaScript的slice方法对数据数组进行切片,以及设计前进/后退导航按钮,实现了一种高效且用户友好的内容展示方式,允许用户按页浏览大量数据,避免一次性加载所有内容。

1. 概述与核心概念

在web开发中,当需要展示大量结构化数据时,一次性加载并显示所有内容可能会导致页面性能下降和用户体验不佳。此时,分页(pagination)成为一种常见的解决方案。它允许我们将数据分成若干页,每次只显示一页内容,并通过导航控件(如“上一页”、“下一页”按钮)让用户在不同页之间切换。

本教程将演示如何在React组件中实现一个卡片式列表的分页功能,具体涉及以下核心概念:

  • 状态管理(State Management):使用React的useState Hook来追踪当前页码。
  • 数据切片(Data Slicing):利用JavaScript数组的slice()方法,根据当前页码和每页显示数量动态截取所需的数据子集。
  • 条件渲染(Conditional Rendering):根据页码和数据总数,动态控制导航按钮的可用状态。

2. 组件结构与数据准备

我们假设有两个主要的React组件:PersonList(负责列表的整体逻辑和分页)和 Person(负责单张卡片的展示)。数据源是一个包含人物信息的数组。

2.1 Person 组件

Person 组件是一个纯粹的展示型组件,它接收人物的姓名、职位、经验和图片URL作为属性,并将其渲染为一张卡片。

// Person.jsx
const Person = ({ name, exp, post, img }) => {
  return (
    <div className="person_wrapper">
      <div className="person_img">
        <img src={img} alt={name} />
      </div>
      <div className="person_text">
        <h2 className="person_name"> {name} </h2>
        <p className="person_post"> {post} </p>
        <p className="person_exp"> {exp} </p>
      </div>
    </div>
  );
};

export default Person;

2.2 数据源 personArr

数据源是一个简单的JavaScript数组,其中每个对象代表一个人物。

// helpers/personList.js
const personArr = [
  {
    img: 'sdfs',
    name: '张三',
    post: '高级前端工程师',
    exp: '工作经验5年',
  },
  {
    img: 'sdf',
    name: '李四',
    post: '后端开发工程师',
    exp: '工作经验3年',
  },
  {
    img: 'sgds',
    name: '王五',
    post: 'UI/UX设计师',
    exp: '工作经验2年',
  },
  {
    img: 'fdhdf',
    name: '赵六',
    post: '项目经理',
    exp: '工作经验8年',
  },
  {
    img: 'sdfs',
    name: '钱七',
    post: '数据分析师',
    exp: '工作经验4年',
  },
  {
    img: 'sdf',
    name: '孙八',
    post: '测试工程师',
    exp: '工作经验6年',
  },
  // ... 更多数据
];

export { personArr };

3. 实现 PersonList 分页逻辑

PersonList 组件将是实现分页的核心。它需要引入useState Hook来管理当前页码,并根据页码动态渲染Person卡片。

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
// PersonList.jsx
import React, { useState } from 'react'; // 引入 useState
import Person from '../person/Person';
import './personList.css'; // 假设有相关的CSS样式
import { personArr } from '../helpers/personList';

const PersonList = () => {
  // 1. 定义状态:当前页码,初始值为1
  const [page, setPage] = useState(1);
  // 2. 定义常量:每页显示的卡片数量
  const pageSize = 3;

  // 3. 计算当前页的数据切片
  // slice(startIndex, endIndex) 不包含 endIndex
  // startIndex: (page - 1) * pageSize
  // endIndex: pageSize * page
  const startIndex = (page - 1) * pageSize;
  const endIndex = pageSize * page;
  const currentPageData = personArr.slice(startIndex, endIndex);

  // 4. 计算总页数
  const totalPages = Math.ceil(personArr.length / pageSize);

  return (
    <div className="list_wrapper">
      {/* 渲染当前页的卡片 */}
      {currentPageData.map((el, i) => {
        // 注意:在实际项目中,如果数据项有唯一ID,应使用ID作为key,而不是索引i
        return (
          <Person
            key={`${el.name}-${i}`} // 更好的key策略
            name={el.name}
            post={el.post}
            img={el.img}
            exp={el.exp}
          />
        );
      })}

      {/* 分页导航按钮 */}
      <div className="pagination_controls">
        <button
          // 当当前页码小于等于1时,禁用“后退”按钮
          disabled={page <= 1}
          onClick={() => setPage((prev) => prev - 1)}
        >
          后退
        </button>
        <button
          // 当当前页码大于等于总页数时,禁用“前进”按钮
          disabled={page >= totalPages}
          onClick={() => setPage((prev) => prev + 1)}
        >
          前进
        </button>
      </div>
    </div>
  );
};

export default PersonList;

3.1 代码解析

  1. useState(1): 初始化 page 状态变量为 1,表示默认显示第一页。
  2. pageSize = 3: 定义每页显示3张卡片。这个值可以根据需求调整,或者通过状态管理使其动态可配置。
  3. personArr.slice((page - 1) * pageSize, pageSize * page): 这是实现分页的核心。
    • (page - 1) * pageSize:计算当前页的起始索引。例如,第一页(page=1)从索引0开始,第二页(page=2)从索引3开始。
    • pageSize * page:计算当前页的结束索引(不包含)。例如,第一页(page=1)到索引3(不包含),即索引0、1、2。
    • slice() 方法返回一个新数组,包含从起始索引到结束索引(不含)的元素。
  4. Math.ceil(personArr.length / pageSize): 计算总页数。Math.ceil确保即使数据不能被pageSize整除,也能正确地向上取整,保证所有数据都能被访问到。
  5. 导航按钮的 disabled 属性:
    • 后退按钮: disabled={page <= 1}。当当前页是第一页时,禁用“后退”按钮,防止用户导航到无效的负数页。
    • 前进按钮: disabled={page >= totalPages}。当当前页是最后一页时,禁用“前进”按钮,防止用户导航到超出数据范围的页。
  6. onClick 事件处理器:
    • setPage((prev) => prev - 1):点击“后退”按钮时,将页码减1。使用函数式更新(prev => prev - 1)可以确保在多次快速点击时,状态更新是基于最新的状态值。
    • setPage((prev) => prev + 1):点击“前进”按钮时,将页码加1。

4. 样式(CSS)考虑

虽然JavaScript逻辑实现了分页功能,但要达到“卡片排成一行,宽度显示3张卡片”的视觉效果,还需要适当的CSS样式。这通常涉及Flexbox或Grid布局。

例如,list_wrapper 和 person_wrapper 的CSS可能如下:

/* personList.css */
.list_wrapper {
  display: flex; /* 使卡片横向排列 */
  flex-wrap: nowrap; /* 不换行,保持单行 */
  overflow-x: hidden; /* 隐藏超出容器的卡片,配合JS分页 */
  gap: 20px; /* 卡片之间的间距 */
  justify-content: flex-start; /* 左对齐 */
  align-items: flex-start;
  width: 100%; /* 或固定宽度 */
  box-sizing: border-box;
  padding: 20px;
}

.person_wrapper {
  flex: 0 0 calc(33.333% - 14px); /* 每行显示3张卡片,减去间距 */
  max-width: calc(33.333% - 14px); /* 确保宽度 */
  box-sizing: border-box;
  border: 1px solid #eee;
  padding: 15px;
  text-align: center;
  /* 其他样式 */
}

.pagination_controls {
  margin-top: 20px;
  text-align: center;
}

.pagination_controls button {
  padding: 10px 20px;
  margin: 0 10px;
  cursor: pointer;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 5px;
}

.pagination_controls button:disabled {
  background-color: #cccccc;
  cursor: not-allowed;
}

注意事项:

  • overflow-x: hidden; 在 list_wrapper 上是关键,它确保只有当前页的卡片可见。当页码改变时,slice 方法会重新渲染新的卡片集合。
  • flex: 0 0 calc(33.333% - 14px); 用于 person_wrapper,确保每行显示3张卡片,并考虑了 gap 或 margin 带来的间距。

5. 总结

通过上述步骤,我们成功地在React中实现了一个动态、可分页的卡片列表。这种方法不仅优化了大型数据集的展示性能,还通过直观的导航按钮提升了用户体验。核心在于利用React的状态管理能力与JavaScript数组的强大操作方法,将复杂的数据展示问题分解为可管理的逻辑单元。在实际开发中,还可以进一步考虑添加键盘导航、页码显示、以及更复杂的动画效果来增强用户交互。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1687

2023.09.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1687

2023.09.19

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

1432

2025.09.03

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3140

2024.08.15

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

837

2023.12.18

flex教程
flex教程

php中文网为大家带来了flex教程合集,Flex是采用Flex布局的元素,称为Flex容器(flex container),简称"容器",它的所有子元素自动成为容器成员,有三个核心概念: flex项,需要布局的元素;flex容器,其包含flex项;排列方向,这决定了flex项的布局方向。php中文网还为大家带来flex的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

8357

2023.06.14

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

40

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

40

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.7万人学习

CSS教程
CSS教程

共754课时 | 94.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn