You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现点击分页按钮时显示Skeleton,3秒后自动隐藏?

解决分页切换时重新显示Skeleton的问题

问题场景

当前代码仅在页面初始加载时显示Skeleton占位,点击分页组件切换内容时,Skeleton不再触发显示,需要实现每次分页切换都显示Skeleton,3秒后自动切换为CardMedia。

解决方案

核心思路是:在分页切换时重置loading状态为true,同时启动定时器延迟3秒将其设为false,并做好定时器的清理避免内存泄漏。

1. 调整状态与工具函数

添加useRef保存定时器ID,抽离统一的loading重置逻辑:

import { useState, useEffect, useRef } from 'react';

// 状态定义
const [loading, setLoading] = useState(true);
const [currentpage, setCurrentpage] = useState(1);
// 用于保存定时器ID,清理冗余定时器
const timerRef = useRef(null);

// 统一处理loading重置与定时器逻辑
const resetLoading = () => {
  setLoading(true);
  // 清理之前未执行的定时器,避免状态混乱
  if (timerRef.current) {
    clearTimeout(timerRef.current);
  }
  // 3秒后关闭loading
  timerRef.current = setTimeout(() => {
    setLoading(false);
  }, 3000);
};

2. 初始加载触发逻辑

在组件挂载时调用resetLoading,同时在卸载时清理定时器:

useEffect(() => {
  resetLoading();
  // 组件卸载时清理定时器,防止内存泄漏
  return () => {
    if (timerRef.current) {
      clearTimeout(timerRef.current);
    }
  };
}, []);

3. 修改分页切换函数

在分页切换时调用resetLoading,触发Skeleton显示:

const handleChange = (event, value) => {
  setCurrentpage(value);
  // 切换分页时重置loading
  resetLoading();
};

// 分页组件代码不变
<Pagination
  count={Math.ceil(Myjson.length / postsPerpage)}
  onChange={handleChange}
/>

4. 显示逻辑保持不变

原有的Skeleton与CardMedia切换逻辑无需修改:

{loading ? (
  <Skeleton
    variant="rectangular"
    width={308}
    height={420}
    animation="wave"
  />
) : (
  <CardMedia
    sx={{ height: 420 }}
    image={item.itemMainPic}
    title="green iguana"
  />
)}

关键说明

  • 抽离resetLoading函数,统一处理初始加载和分页切换的loading逻辑,避免代码重复
  • 使用useRef保存定时器ID,防止多次切换分页时产生多个定时器,导致loading状态异常
  • 组件卸载时清理定时器,避免内存泄漏问题

内容的提问来源于stack exchange,提问作者daan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:25:18