React-banner轮播

与传统的轮播概念一样

分成三个部分

能够左右点击的navigator

底部随着画面改动

而active的dot

最後就是slideshow

首先第一步得先做一个容器

并把所有图片排列成一长条

每一张图片变动

概念都是以整个画面的left:n*-100%再做滑动

/* width: 500%; */
height: auto;
overflow: hidden;
display: flex;
justify-content: start;
position: relative;
left: 0;
transition: 0.5s all ease-in-out;

为了能够未来增加图片数量(这边预设为5张,注:此处的active为slideIndex的意思)

此处的width在react内控制

const loop={left:(active-1)*(-100)+'%',width:picData.map(f=>f.id).length*100+'%'};

图片排列结束後

在ui上印出图片

<div className={style.slideshowSlidesWrap} style={loop}>
    {picData.map(pd=>(
        <a href={pd.link2} className={style.slide} target="_blank" key={pd.id}><img src={pd.link1} alt={pd.alt}/></a>
    ))}
</div>

接着准备左右点击的navigator

此处准备一个handleClick事件於navigator上

并取消点击连结事件

const handlePrev=(e)=>{
    e.preventDefault();
    active>=2 ?setActive(c=>c-1):setActive(picData.map(f=>f.id).length);
};
const handleNext=(e)=>{
    e.preventDefault();
    active<=picData.map(f=>f.id).length-1? setActive(c=>c+1):setActive(1);        
};

在此处首先是定义useState(active)作为slidepic的index

预设起始值为1,useState(1)

并随着点击前进或是後退而+1、-1

到了第五张无法前进时

再点击,会回到第一张

第一张无法後退时

再点击,会变到第五张

此处考虑到未来添加图片的不确定性

图片的连结是用JSON档来描述

於是使用picData.map(f=>f.id)来计算出

加入图片连结的数量来定义总图片数

接下来定义图片下方的dot

这边必须在dot的container中

加入判断式

{picData.map((dot)=>(
    dot.id = = active?<div className={`${style.dot} ${style.active}`} key={dot.id} onClick={()=>{handlePic(dot.id)}}></div> : 
                      <div className={style.dot} key={dot.id} onClick={()=>{handlePic(ki.id)}}></div>
))}

这边的解释是

loop出pic的数量并计算出相对应的dot数(id:1~5与useState(active)相对应)

若dot的id等於useState(active)

class会加入active这个class使dot变色

其他不相等於useState(active)的class

则会维持原本的颜色

每个dot也会加入相对应id的handleClick事件

点击dot会使图片跳至相对应id的图片

const handlePic=(id)=>{
    setActive(id);
};

最後若是想加入秒数轮播的话

这边使用setInterval加入在useEffct内

useEffect(()=>{
    let loop=setInterval(()=>{
        active<=picData.map(f=>f.id).length-1?setActive(active+1):setActive(1);
        },3000);
    return ()=>clearInterval(loop);
},[active]);

此处须注意两点

必须做一个return unmount的动作

否则此处active会一直叠加上去

最後轮播会卡住

另外在dependencies需加入active

侦测active改变时

画面再重新render

若没有加入active

此处画面不会改变

最後setInterval内放入一个三元判断式

若这个active小於或等於loop出来的id数量

active会继续+1往前进

若是大於loop的数量

则active回到1


<<:  git - 3 ( remote、git pull = git fetch + git merge )

>>:  SPML用於将跨资讯系统之创建和管理实体和属性的过程自动化

Day24 React useContext-在子元件使用context

在此专案练习使用function的方式建立元件,因此在子元件使用Hook中的useContext,来...

Day 18 ( 中级 ) 地球绕着太阳转

地球绕着太阳转 教学原文参考:地球绕着太阳转 这篇文章会介绍,如何在 Scratch 3 里使用重复...

LEAP(轻量级可扩展认证协议)

-EAP和802.1X 以下是维基百科的摘录: EAP不是有线协议;相反,它仅定义消息格式。每个使...

腾讯云轻量应用服务器 CentOS 7.6 升级内核开启 BBR

最近开通了良心云香港轻量,发现秋水逸冰的「一键 BBR 脚本」无法切换到最新内核开启 BBR 前提是...

Day 24 - [Android APP] 02-界面设计

昨天讲完架构面,今天不那麽技术,来讲界面设计。 画面设计上由於介面是设计给长者使用,因此字型较大。 ...