Home > Blockchain >  Is there a way to show Skeleton whenever I click on pagination buttons and then disable it after 3 s
Is there a way to show Skeleton whenever I click on pagination buttons and then disable it after 3 s

Time:01-11

This part of my code shows a Skeleton which is a placeholder preview for CardMedia.

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

I'm showing the Skeleton when the loading is true and using useEffect after 3 seconds I setLoading(false):

useEffect(() => {
  setTimeout(() => {
    setLoading(false);
  }, 3000);
}, []);
const [loading, setLoading] = useState(true);

I have other CardMedias that I can show them using the pagination:

const handleChange = (event, value) => {
  setCurrentpage(value);
};

<Pagination
  count={Math.ceil(Myjson.length / postsPerpage)}
  onChange={handleChange}
/>

But when I click on different pagination buttons, it no longer shows a Skeleton, so that means I have to reload the window, in other words the useEffect works only once and when I load other cards using pagination there is no Skeleton.

Is there a way to show Skeleton whenever I click on pagination buttons and then disable it after 3 seconds?

Since the code was too long, I simplified it.

CodePudding user response:

If I understand the question correctly you are basically wanting to render the skeleton on the initial component mount and any time the currentPage state updates. For this I believe you can add currentPage as a dependency to the useEffect hook.

Example:

const [currentPage, setCurrentPage] = React.useState(....);
const [loading, setLoading] = useState(true);

useEffect(() => {
  setLoading(true);

  const timer = setTimeout(() => {
    setLoading(false);
  }, 3000);

  // Return cleanup function to clear timer if currentPage updates
  // or the component unmounts prior to timeout expiring.
  return () => {
    clearTimeout(timer);
  };
}, [currentPage]);

...
  • Related