react实现列表滚动组件

11 篇文章 0 订阅

1.需求

在开发项目的时候,从服务端获取到数据列表后,展示给用户看:需要实现数据自动滚动效果,怎么实现呢?如下图所示:

2.实现

把上面需要实现的功能写成一个组件,页面直接调用该组件即可,代码如下:

要引入组件页面的代码:   

import Scroll from "../../components/Scroll";
 
const Index = () => {
 
 return (
        <div class={style.main}>
                <Scroll />
        </div>
    )
}
 
export default Index;

组件:

import style from "./style.less";
import React, { useEffect, useRef, useState } from "react";
 
const Scroll = () => {
        const timer = useRef(null);
        //这里的数据是通过服务端api接口获取的
        const marqueeList = [
            {
                phone: "155****1111",
                content: "签到获取",
                money: 12.22,
            },
            {
                phone: "151****1111",
                content: "签到获取",
                money: 2,
            },
            {
                phone: "152****1111",
                content: "签到获取",
                money: 2.22,
            },
            ...
        ];
        //是否滚动
        const [isScrolle, setIsScrolle] = useState(true);
        //滚动速度,值越小,滚动越快
        const scrollSpeed = 100;
        const warper = useRef();
        //原数据
        const childDom = useRef();
        //拷贝数据
        const childDomCopy = useRef();
        //鼠标移动,移除方法
        const hoverHandler = (flag) => setIsScrolle(flag);

        useEffect(() => {
            // 设置轮播滚动多拷贝一层,让它无缝滚动
            childDom.current.innerHTML = childDomCopy.current.innerHTML;
            if (isScrolle) {
                if (timer.current) {
                    clearInterval(timer.current);
                }
                timer.current = setInterval(() => {
                    warper.current.scrollTop >= childDom.current.scrollHeight
                        ? (warper.current.scrollTop = 0)
                        : warper.current.scrollTop++;
                }, scrollSpeed);
            }
            return () => {
                clearInterval(timer.current);
            };
        }, [isScrolle]);

        return (
            <div class={style.content}>
                <div class={style.parent} ref={warper}>
                    <div class={`${style.ul_scoll}`} ref={childDomCopy}>
                        {marqueeList.map((value, index) => (
                            <li
                                style={{backgroundColor: index % 2 == 0 ? "#S1AAAA" : "#ABCDEF"}}
                                key={value}
                                onMouseOver={() => hoverHandler(false)}
                                onMouseLeave={() => hoverHandler(true)}
                            >
                                <div class={style.li_intro}>
                                    <div>
                                        {value.phone}
                                    </div>
                                    <div>
                                        {value.content}
                                    </div>
                                    <div class={style.li_money_intro}>
                                        <div  class={style.li_money}>
                                            +{value.money}
                                        </div>
                                        <div  class={style.li_rmb}>
                                            RMB
                                        </div>
                                    </div>
                                </div>
                            </li>
                        ))}
                    </div>
                    <div class={`${style.ul_scoll}`} ref={childDomCopy}></div>
                </div>
            </div>
        );
};
 
export default Scroll;

css:

.content {
  width: 100%;
  height: 14.16rem;
  overflow: hidden;
  position: relative;
  margin: auto;
}

.parent {
  top: 1rem;
  position: relative;
  height: 11.16rem;
  overflow: hidden;
  line-height: 2.5rem;
  overflow-y: scroll;
  scrollbar-width: none;
  -ms-overflow-style: none;
}

.parent::-webkit-scrollbar {
  display: none;
}

.ul_scoll li {
  width: 100%;
  height: 2.5rem;
  font-size: 0.9rem;
  font-weight: bold;
  text-align: center;
  letter-spacing: 0.025rem;
  line-height: 2.5rem;
  color: red;
}

.li_intro {
  color: #205F59;
  font-weight: 930;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  display: flex;
  padding-left: 0.25rem;
  padding-right: 0.25rem;
}

.li_money_intro {
  display:flex;
  color: #39B54A;
}

.li_oney {
  font-size: 1rem;
}

.li_rmb {
  color:#FF6000;
  margin-left:0.8rem;
  font-size: 0.8rem;
}

这样就能够实现数据不停滚动了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现滚动楼梯导航,我们需要使用React来创建一个组件来处理导航和滚动功能。以下是一个基本的示例代码: ```javascript import React, { useState, useEffect } from "react"; function ScrollNav() { const [active, setActive] = useState(0); const [floors, setFloors] = useState([]); useEffect(() => { const floorList = document.querySelectorAll(".floor"); const floorArray = Array.from(floorList).map((floor) => ({ id: floor.id, offsetTop: floor.offsetTop, })); setFloors(floorArray); }, []); const handleScroll = () => { const scrollPosition = window.scrollY; const floorIndex = floors.findIndex( (floor) => scrollPosition >= floor.offsetTop - 50 ); if (floorIndex !== active) { setActive(floorIndex); } }; useEffect(() => { window.addEventListener("scroll", handleScroll); return () => { window.removeEventListener("scroll", handleScroll); }; }); return ( <nav> <ul> {floors.map((floor, index) => ( <li key={floor.id} className={active === index ? "active" : ""} onClick={() => { window.scrollTo({ top: floor.offsetTop, behavior: "smooth", }); }} > {floor.id} </li> ))} </ul> </nav> ); } export default ScrollNav; ``` 在这个组件中,我们首先使用useState和useEffect钩子来存储和更新当前活动的楼层和所有楼层的列表。然后,我们使用useEffect钩子来获取所有楼层的偏移量,并在滚动窗口时更新活动楼层的状态。最后,我们将所有楼层列表渲染为导航列表,并为每个楼层添加一个事件侦听器,以在单击时平滑滚动到该楼层。 要使用此组件,请将其导入到您的项目中,然后将其添加到您的页面上,如下所示: ```javascript import React from "react"; import ScrollNav from "./ScrollNav"; function App() { return ( <div> <ScrollNav /> <div className="floor" id="floor1"> Floor 1 content here </div> <div className="floor" id="floor2"> Floor 2 content here </div> <div className="floor" id="floor3"> Floor 3 content here </div> <div className="floor" id="floor4"> Floor 4 content here </div> </div> ); } ``` 在此示例中,我们将ScrollNav组件添加到页面的顶部,并在页面中添加了几个楼层,每个楼层都有一个唯一的ID和.floor类。这些类和ID用于获取楼层的偏移量,并将其添加到楼层列表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值