超详细教程:使用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;对输入的句子随…

解决Qt UI界面卡顿的优化方法

以下是一些常见的Qt界面卡顿优化方法: 使用多线程:将耗时操作放在后台线程中执行,避免阻塞主线程。减少界面刷新频率:只在必要时进行界面更新,避免频繁的重绘。使用异步加载:对于大量数据的加载,可以采用异步加载的方式,逐步显示数据,减少界面卡顿感。减少布局计算量:…

7.26 SpringBoot项目实战【还书】

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

后端低代码平台探索总结

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

鸿蒙开发之用户隐私权限申请

一、简介 鸿蒙开发过程中可用于请求的权限一共有两种&#xff1a;normal和system_basic。以下内容摘自官网&#xff1a; normal权限 normal 权限允许应用访问超出默认规则外的普通系统资源。这些系统资源的开放&#xff08;包括数据和功能&#xff09;对用户隐私以及其他应用带…

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

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

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

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

剑指offer A + B

剑指offer A B 题目 输入两个整数&#xff0c;求这两个整数的和是多少。 输入格式 输入两个整数A,B&#xff0c;用空格隔开&#xff0c;0≤A,B≤10的8次幂 输出格式 输出一个整数&#xff0c;表示这两个数的和 样例输入&#xff1a; 3 4样例输出&#xff1a; 7参考答…

SQL基础:表的基本操作

上一节中&#xff0c;我们进行了学习环境的搭建。这一节我们来学习一下表的基本操作。 表是关系型数据库的基本组成部分&#xff0c;所有的数据都以表的形式进行组织。而表又由列构成&#xff0c;所以我们要先说明一下列。 列 列列名列的数据类型。列名一般用于描述所存储的…

什么是容器化?容器化如何工作?

什么是容器化&#xff1f;容器化有哪些优势&#xff1f;容器化有哪些使用案例&#xff1f;容器化如何工作&#xff1f;参考 什么是容器化&#xff1f; 容器化是一种软件部署流程。在传统场景中&#xff0c;要在计算机上运行任何应用程序&#xff0c;必须安装与计算机操作系统匹…

matlab实现单精度、16进制之间的转换函数

matlab 单精度转16进制&#xff1a;num2hex(single(1.0)) matlab16进制转单精度浮点型&#xff1a;typecast(uint32(hex2dec(‘3f000000’)),‘single’) 相关使用连接&#xff1a; https://blog.csdn.net/jxls378816/article/details/109071569 https://blog.csdn.net/sangba…

Spring Boot i18n中文文档

本文为官方文档直译版本。原文链接 Spring Boot 支持本地化消息&#xff0c;因此您的应用程序可以满足不同语言偏好的用户。默认情况下&#xff0c;Spring Boot 会在类路径的根目录下查找是否存在消息资源包。 自动配置适用于已配置资源包的默认属性文件&#xff08;默认为 mes…

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

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

C 库函数 - time()

描述 C 库函数 time_t time(time_t *seconds) 返回自纪元 Epoch&#xff08;1970-01-01 00:00:00 UTC&#xff09;起经过的时间&#xff0c;以秒为单位。如果 seconds 不为空&#xff0c;则返回值也存储在变量 seconds 中。 声明 下面是 time() 函数的声明。 time_t time(t…

【已解决】Atlas 导入 Hive 元数据,执行 import-hive.sh 报错

部署完 Atlas 之后&#xff0c;尝试导入 Hive 元数据&#xff0c;遇到了一些错误&#xff0c;特此记录一下&#xff0c;方便你我他。 执行 import-hive.sh 报错 [omchadoop102 apache-atlas-2.2.0]$ hook-bin/import-hive.sh Using Hive configuration directory [/opt/module…

怎样长时间保持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;“小学生近视比例日益提高&#…