搜尋

首頁  >  問答  >  主體

將 React ImageSlider 轉換為 NextJS

我在 React 中有以下圖像滑塊,它按預期工作:

import React, { useState, useEffect } from "react";
import item1 from "./../assets/images/items/1.jpg";
import item2 from "./../assets/images/items/2.gif";

const imgs = [item1, item2]; // Array of images

const ImageSlider = () => {
  const [current, setCurrent] = useState(0); // Initialize state to display the first image

  // Change image every 2 seconds
  useEffect(() => {
    const interval = setInterval(() => {
      setCurrent((current) => (current + 1) % imgs.length); // Move to the next image, go back to the first image after the last
    }, 4000); // Change every 2 seconds

    return () => {
      clearInterval(interval); // Clean up on unmount
    };
  }, []);

  return (
    <div className="relative">
      <img
        src={imgs[0]}
        className="w-full h-auto opacity-0"
        alt="placeholder"
      />
      {imgs.map((img, index) => (
        <img
          key={index}
          src={img}
          alt={`slide-img-${index}`}
          className={`absolute top-0 transition-opacity duration-1000 ease-in-out ${
            current === index ? "opacity-100" : "opacity-0"
          } w-full h-auto`}
        />
      ))}
    </div>
  );
};

export default ImageSlider;

但它在 NextJS 中不起作用,我對其進行了一些修改以修復錯誤:

"use client";
import React, { useState, useEffect } from "react";

const imgs = ["/images/1.jpg", "/images/2.gif", "/images/3.jpg"];
const ImageSlider = () => {
  const [current, setCurrent] = useState(0); // Initialize state to display the first image

  // Change image every 2 seconds
  useEffect(() => {
    const interval = setInterval(() => {
      setCurrent((current) => (current + 1) % imgs.length); // Move to the next image, go back to the first image after the last
    }, 2000); // Change every 2 seconds

    return () => {
      clearInterval(interval); // Clean up on unmount
    };
  }, []);

  return (
    <div className="relative">
      <img
        src={imgs[0]}
        className="w-full h-auto opacity-0"
        alt="placeholder"
      />
      {imgs.map((img, index) => (
        <img
          key={index}
          src={img}
          alt={`slide-img-${index}`}
          className={`absolute top-0 transition-opacity duration-1000 ease-in-out ${
            current === index ? "opacity-100" : "opacity-0"
          } w-full h-auto`}
        />
      ))}
    </div>
  );
};

export default ImageSlider;

我嘗試在元件頂部新增「使用客戶端」並修改程式碼以修復 IDE 顯示的錯誤,陣列中的所有圖像都顯示在瀏覽器網路標籤中。

P粉225961749P粉225961749234 天前2434

全部回覆(1)我來回復

  • P粉194541072

    P粉1945410722024-04-06 00:10:09

    在 Next.js 中,您不能直接在頂級元件中使用 React hooks。相反,您可以在 Next.js 的 useEffect 函數中使用 useEffect 掛鉤。以下是修改程式碼使其在 Next.js 中運行的方法:

    import { useState, useEffect } from "react";
    
    const imgs = ["/images/1.jpg", "/images/2.gif", "/images/3.jpg"];
    const ImageSlider = () => {
    const [current, setCurrent] = useState(0);
    
    useEffect(() => {
    const interval = setInterval(() => {
      setCurrent((current) => (current + 1) % imgs.length);
    }, 2000);
    
    return () => {
      clearInterval(interval);
    };
    }, []); // Empty dependency array to run effect only once
    
    return (
    
    placeholder {imgs.map((img, index) => ( {`slide-img-${index}`} ))}
    ); }; export default ImageSlider;

    回覆
    0
  • 取消回覆