超详细教程:使用React实现动态轮播图

前言

轮播组件是常见的一种方式,用来展示图像、信息或者是广告。我们可以使用React来创建一个轮播组件,并且利用其中的State和effect Hook来创建一款动态的、可以自动播放的轮播组件。

效果

轮播组件会展示一个平铺的图片列表。在图片列表下方是一组小圆点,每个小圆点对应一个图片。当一个新的图片显示时,相对应的小圆点会高亮。组件会每隔一段时间自动切换图片,并且当它切换到最后一张图片后,会继续切回第一张图片。
使用React实现动态轮播图

原理分析

轮播组件的实现依赖于React的**useStateuseEffect**这两个Hook。

  1. 我们首先通过**useState创建一个index变量以及一个setIndex函数。index**记录了我们当前展示图片的位置。
  2. 下面我们会创建一个名为**list**的变量,它会把图片数组中第一张图片复制一份添加到数组末尾。
  3. 接下来我们在**useEffect中设置一个定时任务,每隔2秒钟更新一次index**的值,等于在每两秒钟播放下一张图片。
  4. 最后,我们根据**index的值,来计算需要平移的比例,然后定义一个transform** CSS属性,此步骤定义了图片滚动所需要的动画效果。
    使用React实现动态轮播图
    使用React实现动态轮播图

代码实现

  1. 首先,我们导入所需的模块以及定义图片数据。
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",},
];
  1. 然后实现轮播组件的代码:
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"><divref={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 (<liclassName={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"><divref={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 (<liclassName={classnames("dot-item", {"dot-item--active": index === inx,})}></li>);})}</ul></div>);
}

在这个组件中:

  • 我们定义了一个React引用**carouselRef**,通过这个引用我们可以获取到对应渲染的DOM对象。
  • 在每2秒钟,我们通过**goNext函数来触发轮播图的切换。有一个特别的处理,当轮播切换到复制的第一张图片时,改变index**到0并且立即清除过渡效果,使得轮播图看起来像是循环播放的。
  • 当创建轮播组件的HTML部分时,我们基于**index值增加transformtransition**样式,通过CSS动画实现了轮播的滚动效果。
  • 最后我们定义了一个小圆点列表,它的作用是表示当前显示的是哪张图片。小圆点的数量等于图片的数量,但是并不包括复制的第一张图片。哪个小圆点处于活动状态是基于**index**值确定的。

总结

以上就是通过React实现轮播图的方法。这个轮播图基于React的**useStateuseEffect实现,利用了transformtransition**来呈现滑动的动画效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Missing artifact org.wltea.analyzer:ik-analyzer:jar:5.0

没有找到【org.wltea.analyzer】 找到了【org.wltea.ik-analyzer】 https://github.com/wks/ik-analyzer https://github.com/wks/ik-analyzer.git https://code.google.com/archive/p/ik-analyzer/downloads?page2 C:\Users\Administrator\Desktop\ik-analyzer-master>m…

【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数

1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数&#xff08;1&#xff09;substring 截取字符串&#xff08;2&#xff09;replace 替换&#xff08;3&#xff09;regexp_replace 正则替换&#xff08;4&#xff09;regexp 正则匹配&#xff08;5&#xff…

机器学习---模型评估

1、混淆矩阵 对以上混淆矩阵的解释&#xff1a; P&#xff1a;样本数据中的正例数。 N&#xff1a;样本数据中的负例数。 Y&#xff1a;通过模型预测出来的正例数。 N&#xff1a;通过模型预测出来的负例数。 True Positives:真阳性&#xff0c;表示实际是正样本预测成正样…

自然语言处理阅读第二弹

HuggingFace 镜像网站模型库 NLP中的自回归模型和自编码模型 自回归&#xff1a;根据上文内容预测下一个可能的单词&#xff0c;或者根据下文预测上一个可能的单词。只能利用上文或者下文的信息&#xff0c;不能同时利用上文和下文的信息。自编码&#xff1a;对输入的句子随…

7.26 SpringBoot项目实战【还书】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 本文是项目实战 业务接口 的最后一篇,上文 曾说过【还书】的 入口是【我的借阅记录】,因为【还书】是基于一次借阅记录而言,另外在4.2 数据库设计 曾分析过【还书】的业务场景,需要执行两步操作: 更新【借阅记…

后端低代码平台探索总结

业务需求快速变化的背景 我们在对业务需求进行梳理后&#xff0c;在进行程序设计时&#xff0c;对于将来可能发生变化的常量、变量、阀值、开关、条件、公式等等&#xff0c;可能会配置在环境变量或数字字典来支持可配置。但是需求变化往往会更加复杂、更加不可预测&#xff0…

C# 命令行参数解析库示例

写在前面 在日常开发中&#xff0c;我们经常会用到命令行参数&#xff0c;比如cmd下的各种指令&#xff1b;还有C#的控制台类型的项目&#xff0c;在默认入口Main函数中&#xff0c;那个args参数&#xff0c;就是有系统传入到程序进程的命令行参数&#xff1b;在传入的参数相对…

STM32/STM8资源节约主义设计方式

STM32/STM8资源节约主义设计方式 在小资源芯片进行代码设计时&#xff0c;如STM32C0系列&#xff0c;STM8系列&#xff0c;因为官方库本身要包含各种场景应用特征的支持&#xff0c;所以会有一些冗余的代码占用更多FLASH空间。当需要实现资源占用最简化设计方式时&#xff0c;…

Docker实战案例研究:深入行业应用与最佳实践

Docker作为一种轻量级、可移植、可扩展的容器化技术&#xff0c;在各行各业都得到了广泛应用。本文将通过深入实际案例&#xff0c;介绍Docker在不同行业的应用以及相应的最佳实践&#xff0c;提供更加丰富的示例代码&#xff0c;以帮助大家更全面地理解和运用Docker的强大功能…

怎样长时间保持SSH会话连接不断开?

操作场景 使用SSH方式登录CentOS Stream操作系统的云服务器时&#xff0c;过一段时间就会自动断开连接。 该文档适用于CentOS/EulerOS系统。 操作方法 编辑/etc/ssh/sshd_config文件设置心跳&#xff0c;保持连接。 编辑/etc/ssh/sshd_config&#xff0c;添加配置项&#x…

数据分析为何要学统计学(10)——如何进行比率检验

比率检验是通过样本推测某种事件的总体占比水平。要求事件仅有互斥的两种情况&#xff0c;即&#xff0c;概率分别为p与1-p。 比率检验分单样本和双样本两种情况&#xff0c;以下我们分别介绍。 1. 单样本比率检验 形如这样的问题&#xff1a;“小学生近视比例日益提高&#…

【BIG_FG_CSDN】*VMware17pro*Linux*Redhit6网络管理(个人向——学习笔记)

物理机中的网络 查看物理网络的方法 “网络连接”—>单点选中网络的选项-->菜单栏中“查看此连接状态”-->“详细信息” “网络连接”中的VM网卡 在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡&#xff0c;它们分别…

【MySQL】MySQL表的操作-创建查看删除和修改

文章目录 1.创建表2.查看表结构3.修改表4.删除表 1.创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名datatype 表示列的类型…

前端之HTML

一.网页及HTML 1.1网页 1.网页是构成网站的基本元素&#xff0c;通常是由图片、链接、文字、声音、视频等元素组成。通常我们看到的网页以.htm或.html后缀结尾的文件&#xff0c;俗称为HTML文件。 2.网站是网页的集合&#xff0c;网页通常是通过浏览器来阅读的HTML格式的文件…

TG-5510cb: txo高稳定性+105℃高温

TG-5510CB是一款高稳定性TCXO&#xff0c;可提供CMOS或限幅正弦输出&#xff0c;5G基站和边缘计算的额定温度为85C&#xff0c;需要室外安装、小型化和无风扇运行。与其他TCXO相比&#xff0c;实验室提供了许多改进&#xff0c;如低温度斜率和相位噪声。符合GR-1244-CORE地层3和…

深度学习记录--参数与超参数

什么是超参数 在深度学习的神经网络图中&#xff0c;有一堆参数&#xff0c;这些参数分成了普通参数和特殊参数&#xff0c;其中特殊参数往往被称为超参数 超参数(hyper parameters),在某种程度上决定了普通的参数&#xff0c;并且是需要额外给出的 如下图 参数设定 对于超…

web服务器之——搭建基于https协议的静态网站

目录 一、HTTPS协议介绍 HTTPS的安全通信机制&#xff1a; 工作流程可大致分为三个阶段&#xff1a; 二、搭建基于https协议的静态网站 第一步&#xff1a;关闭防火墙和SELinux 第二步&#xff1a;安装httpd 准备工作&#xff1a;web服务器搭建 1、挂载 2、编辑配置文…

PLC-Recorder V3 修改服务器和客户端通讯端口的方法

PLC-Recorder V3是服务器和客户端的架构&#xff0c;他们之间用TCP通讯。如果客户端无法与服务器建立连接&#xff08;重启也无效&#xff0c;并且确保没有老版本的PLC-Recorder在运行&#xff09;&#xff0c;则可能是端口被占用了。这时候需要修改他们之间的通讯端口&#xf…

gitlab 通过svn hook 触发

jenkins 起一个item 配置&#xff1a; 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径&#xff0c; 注意是工程&#xff0c;不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器&#xff1a; &#xff0c;重要的是要自…

【二分查找】【z型搜索】LeetCode240:搜索二维矩阵

LeetCoe240搜索矩阵 本文涉及的基础知识点 二分查找算法合集 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;…