如何基于可变长度数组实现固定数量的书籍分批加载功能?
书籍分页加载的正确实现方案
你的思路方向没问题,但代码里有几个细节问题导致功能异常,下面是修正后的完整实现:
问题点梳理
- JSX语法错误:返回的多个元素必须用容器(比如
<div>或<>)包裹 - 未定义
fixedItemLength常量,需要明确每页显示10本的数值 - 未处理书籍总数不足10本的初始显示情况
- 点击按钮时未判断是否已显示全部书籍,会导致
booksShown无意义地增长 map循环缺少唯一key,且未传递书籍数据给<Books>组件
修正后的代码
import { useState } from 'react'; function BooksContainer() { const fixedItemLength = 10; // 每页固定显示10本 const totalBooks = booksData.length; // 初始显示数量:如果总书籍不足10本,直接显示全部 const [booksShown, setBooksShown] = useState(Math.min(fixedItemLength, totalBooks)); const handleShowMore = () => { // 计算下一次要显示的数量:不超过总书籍数 const nextShown = Math.min(booksShown + fixedItemLength, totalBooks); setBooksShown(nextShown); }; return ( <div className="books-container"> {/* 渲染当前要显示的书籍 */} {booksData.slice(0, booksShown).map((book, index) => ( <Books key={index} book={book} /> // 传递书籍数据,添加唯一key ))} {/* 只有还有未显示的书籍时,才显示按钮 */} {booksShown < totalBooks && ( <button onClick={handleShowMore}>Show More</button> )} </div> ); }
关键优化说明
- 初始状态用
Math.min确保不会显示超过总书籍数的内容 - 点击按钮时同样用
Math.min控制上限,避免无效的数值增长 - 按钮仅在有剩余书籍时显示,提升用户体验
- 补充了JSX的容器包裹,修复语法错误
- 给
map循环添加key,符合React的渲染规范,同时传递书籍数据给子组件
内容的提问来源于stack exchange,提问作者Murtaza Alkabie
相关产品推荐
相关产品推荐

