HomeMiddleBanner.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use client";
  2. import { useState } from "react";
  3. import { Swiper, SwiperSlide } from "swiper/react";
  4. import { Navigation } from "swiper/modules";
  5. import "swiper/css";
  6. import "swiper/css/navigation";
  7. import Image from "next/image";
  8. import { HomeSectionImage } from "@/types/home/type";
  9. interface middleBannerProps {
  10. middleBanner: HomeSectionImage[];
  11. }
  12. export default function HomeMiddleBanner({ middleBanner }: middleBannerProps) {
  13. const [activeIndex, setActiveIndex] = useState(0);
  14. const [swiperRef] = useState(null);
  15. if (!middleBanner || middleBanner.length === 0) return null;
  16. const middleBannerImages = middleBanner;
  17. const handleSlideChange = (swiper: any) => {
  18. setActiveIndex(swiper.activeIndex);
  19. };
  20. const handleIndicatorClick = (index: any) => {
  21. if (swiperRef) {
  22. setActiveIndex(index);
  23. }
  24. };
  25. return (
  26. <div className="max-w-screen-md mx-auto p-4">
  27. <Swiper
  28. modules={[Navigation]}
  29. spaceBetween={10}
  30. slidesPerView={1}
  31. onSlideChange={handleSlideChange}
  32. className="mb-6"
  33. >
  34. {middleBannerImages.map((item, idx) => (
  35. <SwiperSlide key={idx}>
  36. <div className="relative w-full h-42">
  37. <Image
  38. src={item.image}
  39. alt={item.title}
  40. fill
  41. className="w-full h-auto object-cover rounded-md"
  42. />
  43. </div>
  44. </SwiperSlide>
  45. ))}
  46. </Swiper>
  47. <div className="flex justify-center gap-2">
  48. <button
  49. onClick={() => handleIndicatorClick(0)}
  50. className={`w-6 h-[5px] rounded-full opacity-100 ${
  51. activeIndex === 0 ? "bg-[#333]" : "bg-[#E5E5E5]"
  52. }`}
  53. aria-label="切换到第一块"
  54. />
  55. <button
  56. onClick={() => handleIndicatorClick(1)}
  57. className={`w-6 h-[5px] rounded-full opacity-100 ${
  58. activeIndex === 1 ? "bg-[#333]" : "bg-[#E5E5E5]"
  59. }`}
  60. aria-label="切换到第二块"
  61. />
  62. </div>
  63. </div>
  64. );
  65. }