最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React實現(xiàn)動態(tài)輪播圖的使用示例

 更新時間:2023年12月21日 09:29:05   作者:樂聞x  
輪播組件是常見的一種方式,用來展示圖像、信息或者是廣告,本文就來介紹一下React實現(xiàn)動態(tài)輪播圖的使用示例,具有一定的參考價值,感興趣的可以了解一下

前言

輪播組件是常見的一種方式,用來展示圖像、信息或者是廣告。我們可以使用React來創(chuàng)建一個輪播組件,并且利用其中的State和effect Hook來創(chuàng)建一款動態(tài)的、可以自動播放的輪播組件。

效果

輪播組件會展示一個平鋪的圖片列表。在圖片列表下方是一組小圓點,每個小圓點對應一個圖片。當一個新的圖片顯示時,相對應的小圓點會高亮。組件會每隔一段時間自動切換圖片,并且當它切換到最后一張圖片后,會繼續(xù)切回第一張圖片。

使用React實現(xiàn)動態(tài)輪播圖

原理分析

輪播組件的實現(xiàn)依賴于React的**useStateuseEffect**這兩個Hook。

  • 我們首先通過**useState創(chuàng)建一個index變量以及一個setIndex函數(shù)。index**記錄了我們當前展示圖片的位置。
  • 下面我們會創(chuàng)建一個名為**list**的變量,它會把圖片數(shù)組中第一張圖片復制一份添加到數(shù)組末尾。
  • 接下來我們在**useEffect中設(shè)置一個定時任務,每隔2秒鐘更新一次index**的值,等于在每兩秒鐘播放下一張圖片。
  • 最后,我們根據(jù)**index的值,來計算需要平移的比例,然后定義一個transform** CSS屬性,此步驟定義了圖片滾動所需要的動畫效果。

使用React實現(xiàn)動態(tài)輪播圖

使用React實現(xiàn)動態(tài)輪播圖

代碼實現(xiàn)

  • 首先,我們導入所需的模塊以及定義圖片數(shù)據(jù)。
import React, { useState } from "react";
import classnames from "classnames";
import "./index.less";

const dataSource = [
  {
    picture:
      "<https://cdn.fmlg1688.cn/build-material/3c76b0a215c64baebded1a690e1ff989.blob>",
    title: "是怎么做出來的",
  },
  {
    picture:
      "<https://cdn.fmlg1688.cn/build-material/image/b3528a0b59f34e32aa4aae4652bee76f.jpeg>",
    title: "成功案例",
  },
  {
    picture:
      "<https://cdn.fmlg1688.cn/build-material/3c76b0a215c64baebded1a690e1ff989.blob>",
    title: "仿木欄桿-03",
  },
];
  • 然后實現(xiàn)輪播組件的代碼:
export default function Carousel() {
  const [index, setIndex] = useState(0);
  const carouselRef = useRef<HTMLDivElement>(null);

  const list = useMemo(() => {
    return [...dataSource, dataSource[0]];
  }, [dataSource]);

  useEffect(() => {
    const goNext = () => {
      setTimeout(() => {
        if (index + 1 === list.length) {
          if (carouselRef.current?.style) {
            carouselRef.current.style.transform = "translateX(0%)";
          }
          setIndex(0);
        } else {
          setIndex(index + 1);
          if (index + 1 === list.length - 1) {
            setTimeout(() => {
              setIndex(0);
            }, 300);
          }
        }
        // setIndex((inx) => {
        //   if (inx + 1 === list.length) {
        //     return 0;
        //   } else {
        //     if (inx + 1 === list.length) {
        //       goNext();
        //     }
        //     ret
        // });
      }, 2000);
    };
    goNext();
  }, [index]);

  console.log("index:", index);

  return (
    <div className="carousel-container">
      <div
        ref={carouselRef}
        className="carousel"
        style={{
          width: `${100 * list.length}%`,
          transform: `translateX(-${(100 / list.length) * index}%)`,
          transition: 0 === index ? `` : "transform 0.3s",
        }}
      >
        {list.map((data) => {
          return (
            <div className="carousel-item">
              <img src={data.picture} />
            </div>
          );
        })}
      </div>
      <ul className="dot">
        {dataSource.map((data, inx) => {
          return (
            <li
              className={classnames("dot-item", {
                "dot-item--active": index === inx,
              })}
            ></li>
          );
        })}
      </ul>
    </div>
  );
}

export default function Carousel() {
  const [index, setIndex] = useState(0);
  const carouselRef = useRef<HTMLDivElement>(null);

  const list = useMemo(() => {
    return [...dataSource, dataSource[0]];
  }, [dataSource]);

  useEffect(() => {
    const goNext = () => {
      setTimeout(() => {
        if (index + 1 === list.length) {
          if (carouselRef.current?.style) {
            carouselRef.current.style.transform = "translateX(0%)";
          }
          setIndex(0);
        } else {
          setIndex(index + 1);
          if (index + 1 === list.length - 1) {
            setTimeout(() => {
              setIndex(0);
            }, 300);
          }
        }  
      }, 2000);
    };
    goNext();
  }, [index]);

  console.log("index:", index);

  return (
    <div className="carousel-container">
      <div
        ref={carouselRef}
        className="carousel"
        style={{
          width: `${100 * list.length}%`,
          transform: `translateX(-${(100 / list.length) * index}%)`,
          transition: 0 === index ? `` : "transform 0.3s",
        }}
      >
        {list.map((data) => {
          return (
            <div className="carousel-item">
              <img src={data.picture} />
            </div>
          );
        })}
      </div>
      <ul className="dot">
        {dataSource.map((data, inx) => {
          return (
            <li
              className={classnames("dot-item", {
                "dot-item--active": index === inx,
              })}
            ></li>
          );
        })}
      </ul>
    </div>
  );
}

在這個組件中:

  • 我們定義了一個React引用**carouselRef**,通過這個引用我們可以獲取到對應渲染的DOM對象。
  • 在每2秒鐘,我們通過**goNext函數(shù)來觸發(fā)輪播圖的切換。有一個特別的處理,當輪播切換到復制的第一張圖片時,改變index**到0并且立即清除過渡效果,使得輪播圖看起來像是循環(huán)播放的。
  • 當創(chuàng)建輪播組件的HTML部分時,我們基于index值增加transformtransition樣式,通過CSS動畫實現(xiàn)了輪播的滾動效果。
  • 最后我們定義了一個小圓點列表,它的作用是表示當前顯示的是哪張圖片。小圓點的數(shù)量等于圖片的數(shù)量,但是并不包括復制的第一張圖片。哪個小圓點處于活動狀態(tài)是基于**index**值確定的。

總結(jié)

這個輪播圖基于React的**useStateuseEffect實現(xiàn),利用了transformtransition**來呈現(xiàn)滑動的動畫效果。

到此這篇關(guān)于React實現(xiàn)動態(tài)輪播圖的使用示例的文章就介紹到這了,更多相關(guān)React 動態(tài)輪播圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React中ref的三種形式使用小結(jié)

    React中ref的三種形式使用小結(jié)

    ref是一個重要的功能,ref主要有三種形式:字符串形式、回調(diào)形式和?createRef,下面就來介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • 詳解react-webpack2-熱模塊替換[HMR]

    詳解react-webpack2-熱模塊替換[HMR]

    這篇文章主要介紹了詳解react-webpack2-熱模塊替換[HMR], 小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • react?component?function組件使用詳解

    react?component?function組件使用詳解

    這篇文章主要為大家介紹了react?component?function組件的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • React各種狀態(tài)管理器的解讀及使用方法

    React各種狀態(tài)管理器的解讀及使用方法

    這篇文章主要介紹了對于React各種狀態(tài)管理器的解讀,文中給大家提到了狀態(tài)管理器是如何使用的,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • ReactHook使用useState更新變量后,如何拿到變量更新后的值

    ReactHook使用useState更新變量后,如何拿到變量更新后的值

    這篇文章主要介紹了ReactHook使用useState更新變量后,如何拿到變量更新后的值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解react-router4 異步加載路由兩種方法

    詳解react-router4 異步加載路由兩種方法

    本篇文章主要介紹了詳解react-router4 異步加載路由兩種方法 ,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • 基于React和antd實現(xiàn)自定義進度條的示例代碼

    基于React和antd實現(xiàn)自定義進度條的示例代碼

    在現(xiàn)代 Web 開發(fā)中,進度條是一種常見且實用的 UI 組件,用于直觀地向用戶展示任務的完成進度,本文將詳細介紹如何使用 React 來構(gòu)建一個自定義的進度條,它不僅能夠動態(tài)展示進度,還具備額外的信息提示功能,需要的朋友可以參考下
    2025-03-03
  • Remix 后臺桌面開發(fā)electron-remix-antd-admin

    Remix 后臺桌面開發(fā)electron-remix-antd-admin

    這篇文章主要為大家介紹了Remix 后臺桌面開發(fā)electron-remix-antd-admin的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • React自定義Hooks的設(shè)計指南

    React自定義Hooks的設(shè)計指南

    React Hooks的出現(xiàn)徹底改變了函數(shù)組件的編寫方式,使我們能夠在不編寫class的情況下使用state和其他React特性,自定義Hooks作為 Hooks機制的高級應用,允許開發(fā)者將可復用的邏輯封裝成獨立的函數(shù),本文將深入探討自定義 Hooks 的設(shè)計原則、實戰(zhàn)技巧以及常見陷阱
    2025-09-09
  • React中useEffect依賴數(shù)組的常見陷阱

    React中useEffect依賴數(shù)組的常見陷阱

    本文主要介紹了React中useEffect依賴數(shù)組的常見陷阱,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-09-09

最新評論

西宁市| 石屏县| 石嘴山市| 蒙阴县| 叙永县| 盐亭县| 大厂| 吴堡县| 和硕县| 镇坪县| 哈巴河县| 北安市| 安国市| 会泽县| 台山市| 确山县| 平定县| 新化县| 梨树县| 沙河市| 平远县| 台南县| 乐山市| 江津市| 沾化县| 开封县| 土默特左旗| 宜昌市| 洱源县| 霍林郭勒市| 茂名市| 沾益县| 兰西县| 怀柔区| 绍兴市| 洞口县| 志丹县| 临汾市| 伊春市| 阿坝| 民乐县|