如何从含4个对象的数组先返回前2项,间隔加载剩余项并修复加载中断问题
问题根因
- 直接对
props调用splice方法:splice是会修改原数组的可变方法,执行一次后原props数组就被截断,后续无法拿到完整数据,且React中props为只读属性不允许直接修改。 - 计数逻辑错误:初始展示2条,后续每次只需要追加1条,原有逻辑的截取长度计算错误,导致只多加载1条就满足停止条件。
useEffect依赖数组为空:会导致闭包陷阱,内部读取的props永远是首次渲染的初始值,若后续props更新会出现数据异常。- 时间参数不符需求:代码中
ms = 3000对应3秒,需求要求间隔5秒,需要调整参数。 - 反转操作直接作用于截取后的数组:
reverse同样是可变方法,最好基于副本操作避免意外污染原数据。
修正后代码
useEffect(() => { const ms = 5000 // 调整为需求要求的5秒间隔 // 先复制原props数组,避免修改原数据 const eventsCopy = [...props] // 初始展示前2条,反转后更新状态 setEventsProps(eventsCopy.slice(0, 2).reverse()) let currentCount = 2 // 记录当前已展示的数量 const interval = setInterval(() => { currentCount += 1 // 已展示数量不超过总长度时继续更新 if (currentCount <= eventsCopy.length) { // 每次截取前currentCount条,反转后更新 setEventsProps(eventsCopy.slice(0, currentCount).reverse()) } else { // 所有数据加载完成后清除定时器 clearInterval(interval) } }, ms) return () => clearInterval(interval) }, [props]) // 把props加入依赖数组,避免闭包问题 // JSX部分 {eventsProps.map(event => ( // 你的原有渲染逻辑 ))}
逻辑说明
- 提前复制完整的props数组作为数据源,全程使用不可变方法
slice截取数据,不会修改原数组。 - 用
currentCount直接记录已展示的条目数量,初始为2,每次间隔加1,直到等于数组总长度后清除定时器,避免无效运行。 - 把props加入useEffect依赖数组,若props发生更新会自动重启加载逻辑,符合React渲染规则。
- 所有反转操作都基于
slice返回的新数组执行,不会污染数据源。
内容的提问来源于stack exchange,提问作者London Creative
相关产品推荐
相关产品推荐

