react hooks 列表无缝滚动组件效果实现

react hooks 列表无缝滚动效果实现

import React, { useEffect, useRef } from 'react';
import './scrollList.scss';

export default function ScrollList(props) {
  const scrollBox = useRef();
  const common1 = useRef();
  const common2 = useRef();
  const timer = useRef(null);
  const { data, column } = props;
  useEffect(() => {
    clearInterval(timer.current);
    scrollBox.current.scrollTop = 0;
    roll(60);
  }, [data]);

  const roll = (t) => {
    if (scrollBox.current.clientHeight > common1.current.clientHeight) {
      return;
    }
    common2.current.innerHTML = common1.current.innerHTML;
    timer.current = setInterval(rollStart, t);
    // 鼠标移入div时暂停滚动
    scrollBox.current.onmouseover = function () {
      clearInterval(timer.current);
    };
    // 鼠标移出div后继续滚动
    scrollBox.current.onmouseout = function () {
      clearInterval(timer.current);
      if (scrollBox.current.clientHeight < common1.current.clientHeight) {
        timer.current = setInterval(rollStart, t);
      }
    };
  };
  // 开始滚动函数
  const rollStart = () => {
    if (!scrollBox.current) return;
    if (scrollBox.current.scrollTop >= common1.current.offsetHeight) {
      scrollBox.current.scrollTop = 0;
    } else {
      scrollBox.current.scrollTop = scrollBox.current.scrollTop + 2;
    }
  };
  return (
    <div ref={scrollBox} className="scroll-list">
      <div ref={common1} className="list-content">
        {data.map((ele, index) => {
          return (
            <ul key={index}>
              {column.map((item) => {
                if (item.renderStyle) {
                  return item.renderStyle(ele[item.key]);
                }

                return ele[item.dataIndex] == '未处理' ? (
                  <li key={item.key} style={{ color: '#f90' }}>
                    {ele[item.dataIndex]}
                  </li>
                ) : ele[item.dataIndex] == '已处理' ? (
                  <li key={item.key} style={{ color: '#0f0' }}>
                    {ele[item.dataIndex]}
                  </li>
                ) : (
                  <li key={item.key} title={ele[item.dataIndex]}>
                    {ele[item.dataIndex]}
                  </li>
                );
              })}
            </ul>
          );
        })}
      </div>
      <div ref={common2} className="list-content"></div>
    </div>
  );
}

style.scss

.scroll-list {
  overflow: hidden;
  height: calc(50vh - 200px);
}
.list-content {
  width: 100%;
  ul {
    height: 30px;
    line-height: 30px;
    display: flex;
  }
  li {
    flex: 1;
    border: 1px solid pink;
  }
}

使用方式:
column 和dataSource 和antd-table的格式是一样的。用起来很方便。

import ScrollList from '@/baseUI/ScrollList';
 <ScrollList column={columns} data={dataSource} />

效果:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用useState和useEffect两个Hooks来实现滚动数字效果。 首先,我们需要定义一个state来保存当前数字的值,以及一个目标数字的值。然后,使用useEffect监听目标数字的变化,当目标数字变化时,启动一个计时器,每隔一定时间更新当前数字的值,直到当前数字等于目标数字。 下面是一个简单的实现示例: ```jsx import React, { useState, useEffect } from 'react'; const ScrollNumber = ({ number }) => { const [currentNumber, setCurrentNumber] = useState(0); const [targetNumber, setTargetNumber] = useState(number); useEffect(() => { setTargetNumber(number); }, [number]); useEffect(() => { let timer = null; if (currentNumber < targetNumber) { timer = setInterval(() => { setCurrentNumber(currentNumber + 1); }, 50); } return () => clearInterval(timer); }, [currentNumber, targetNumber]); return ( <span>{currentNumber.toLocaleString()}</span> ); } export default ScrollNumber; ``` 在上面的示例中,我们定义了一个ScrollNumber组件,接受一个number属性作为目标数字,当number变化时,使用useEffect更新targetNumber的值。然后,使用第二个useEffect监听currentNumber和targetNumber的变化,如果currentNumber小于targetNumber,启动一个计时器,每隔50ms更新一次currentNumber的值,直到currentNumber等于targetNumber。最后,返回一个包含当前数字的span元素。 使用方式如下: ```jsx import React from 'react'; import ScrollNumber from './ScrollNumber'; const App = () => { return ( <div> <h1>ScrollNumber Demo</h1> <ScrollNumber number={123456789} /> </div> ); } export default App; ``` 这样就可以在页面上看到一个滚动数字效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值