React实现自动滚动表格的方法实例

 更新时间:2025年09月12日 11:38:29   作者:苦茶折柳  
React中实现一个自动滚动的表格,结合CSS动画与JavaScript定时器,支持手动暂停、恢复及悬停控制,具有一定的参考价值,感兴趣的可以了解一下

在 React 中实现一个自动滚动的表格,可以通过 CSS 动画和 JavaScript 定时器来实现。以下是一个完整的示例代码,包含示例数据和自动滚动功能。

实现思路:

  • 自动滚动:

使用 setInterval 实现表格的自动滚动。

  • 手动滚动:监听表格的 scroll 事件,当用户手动滚动时,暂停自动滚动。

使用 setTimeout 检测用户是否停止滚动,如果停止滚动一段时间(例如 2 秒),则恢复自动滚动。

  • 鼠标悬停
    鼠标悬停时停止滚动,鼠标移开后继续滚动

代码

import React, { useState, useEffect, useRef } from "react";
import "../Styles/AutoScrollTable.css"; // 引入样式文件

const AutoScrollTable = () => {
  // 示例数据
  const [data, setData] = useState([
    { id: 1, name: "Alice", age: 25, city: "New York" },
    { id: 2, name: "Bob", age: 30, city: "Los Angeles" },
    { id: 3, name: "Charlie", age: 35, city: "Chicago" },
    { id: 4, name: "David", age: 40, city: "Houston" },
    { id: 5, name: "Eva", age: 28, city: "Phoenix" },
    { id: 6, name: "Frank", age: 33, city: "Philadelphia" },
    { id: 7, name: "Grace", age: 22, city: "San Antonio" },
    { id: 8, name: "Hank", age: 45, city: "San Diego" },
    { id: 9, name: "Ivy", age: 29, city: "Dallas" },
    { id: 10, name: "Jack", age: 31, city: "San Jose" },
  ]);

 
  const tableRef = useRef(null); // 用于引用表格容器
  const scrollIntervalRef = useRef(null); // 存储自动滚动的定时器
 
  // 开始自动滚动
  const startAutoScroll = () => {
    if (scrollIntervalRef.current) return; // 如果已经有定时器,则不重复启动
 
    scrollIntervalRef.current = setInterval(() => {
      const table = tableRef.current;
      if (!table) return;
 
      const scrollHeight = table.scrollHeight; // 表格总高度
      const clientHeight = table.clientHeight; // 可视区域高度
      const maxScroll = scrollHeight - clientHeight; // 最大滚动距离
 
      let scrollTop = table.scrollTop + 1; // 每次滚动 1px
      if (scrollTop >= maxScroll) {
        scrollTop = 0; // 滚动到底部后回到顶部
      }
      table.scrollTop = scrollTop;
    }, 50); // 每 50ms 滚动一次
  };
 
  // 停止自动滚动
  const stopAutoScroll = () => {
    if (scrollIntervalRef.current) {
      clearInterval(scrollIntervalRef.current);
      scrollIntervalRef.current = null;
    }
  };
 
  // 处理鼠标事件
  const handleMouseEnter = () => {
    stopAutoScroll();
  };
 
  const handleMouseLeave = () => {
    startAutoScroll();
  };
 
  useEffect(() => {
    const table = tableRef.current;
    if (!table) return;
 
    // 初始化自动滚动
    startAutoScroll();
 
    // 监听鼠标事件
    table.addEventListener("mouseenter", handleMouseEnter);
    table.addEventListener("mouseleave", handleMouseLeave);
 
    // 清除事件监听和定时器
    return () => {
      table.removeEventListener("mouseenter", handleMouseEnter);
      table.removeEventListener("mouseleave", handleMouseLeave);
      stopAutoScroll();
    };
  }, []);
 
  return (
    <div className="table-container">
  <h2>自动滚动表格(鼠标悬停时停止滚动)</h2>
  <div className="scrollable-table" ref={tableRef}>
    <table style={{ borderCollapse: 'collapse', width: '100%', border: '1px solid black' }}>
      <thead>
        <tr>
          <th style={{ border: '1px solid black', padding: '8px' }}>ID</th>
          <th style={{ border: '1px solid black', padding: '8px' }}>Name</th>
          <th style={{ border: '1px solid black', padding: '8px' }}>Age</th>
          <th style={{ border: '1px solid black', padding: '8px' }}>City</th>
        </tr>
      </thead>
      <tbody>
        {data.map((item) => (
          <tr key={item.id} style={{ borderBottom: '1px solid black' }}>
            <td style={{ border: '1px solid black', padding: '8px' }}>{item.id}</td>
            <td style={{ border: '1px solid black', padding: '8px' }}>{item.name}</td>
            <td style={{ border: '1px solid black', padding: '8px' }}>{item.age}</td>
            <td style={{ border: '1px solid black', padding: '8px' }}>{item.city}</td>
          </tr>
        ))}
      </tbody>
    </table>
  </div>
</div>

  );
};
 
export default AutoScrollTable;

样式文件 (AutoScrollTable.css):

.table-container {
  margin: 20px;
  font-family: Arial, sans-serif;
}

.scrollable-table {
  max-height: 300px; /* 设置表格的最大高度 */
  overflow-y: auto; /* 允许垂直滚动 */
  border: 1px solid #ccc; /* 表格边框 */
  border-radius: 4px; /* 圆角 */
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */
}

table {
  width: 100%;
  border-collapse: collapse; /* 单元格合并边框 */
}

th, td {
  border: 1px solid #ddd; /* 单元格边框 */
  padding: 12px; /* 单元格内边距 */
  text-align: left; /* 左对齐 */
}

th {
  background-color: #f4f4f4; /* 表头背景颜色 */
  font-weight: bold; /* 加粗字体 */
}

tr:nth-child(even) {
  background-color: #f9f9f9; /* 偶数行背景色 */
}

tr:hover {
  background-color: #f1f1f1; /* 鼠标悬停行的背景色 */
}

.table-container {
  width: 95%;
  padding: 20px;
  box-sizing: border-box;
}

.scrollable-table {
  overflow: auto;
  height: 300px; /* 设置表格容器的高度以实现滚动效果 */
  border: 1px solid #ccc;
  border-radius: 5px;
}

table {
  width: 100%;
  border-collapse: collapse;
}

thead {
  position: sticky;
  top: 0;
  background-color: #f8f8f8;
}

th, td {
  border: 1px solid #ddd;
  padding: 8px;
  text-align: left;
}

th {
  background-color: #5179be;
  color: white;
}

tbody tr:nth-child(even) {
  background-color: #f2f2f2;
}

tbody tr:hover {
  background-color: #ddd;
}

效果图:

到此这篇关于React实现自动滚动表格的两种方法的文章就介绍到这了,更多相关React 自动滚动表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Ant Design与Ant Design pro入门使用教程

    Ant Design与Ant Design pro入门使用教程

    Ant Design 是一个服务于企业级产品的设计体系,组件库是它的 React 实现,antd 被发布为一个 npm 包方便开发者安装并使用,这篇文章主要介绍了Ant Design与Ant Design pro入门,需要的朋友可以参考下
    2023-12-12
  • React Scheduler 最小堆实现小结

    React Scheduler 最小堆实现小结

    本文主要介绍了React Scheduler 最小堆实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • react 项目 中使用 Dllplugin 打包优化技巧

    react 项目 中使用 Dllplugin 打包优化技巧

    在用 Webpack 打包的时候,对于一些不经常更新的第三方库,比如 react,lodash,vue 我们希望能和自己的代码分离开,这篇文章主要介绍了react 项目 中 使用 Dllplugin 打包优化,需要的朋友可以参考下
    2023-01-01
  • React-Native使用Mobx实现购物车功能

    React-Native使用Mobx实现购物车功能

    本篇文章主要介绍了React-Native使用Mobx实现购物车功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • React 中的重新渲染实现

    React 中的重新渲染实现

    本文主要介绍了React 中的重新渲染实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • React中Ant Design组件日期编辑回显的实现

    React中Ant Design组件日期编辑回显的实现

    本文主要介绍了React中Ant Design组件日期编辑回显的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • React 模式之纯组件使用示例详解

    React 模式之纯组件使用示例详解

    这篇文章主要为大家介绍了React 模式之纯组件使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • React.memo React.useMemo对项目性能优化使用详解

    React.memo React.useMemo对项目性能优化使用详解

    这篇文章主要为大家介绍了React.memo React.useMemo对项目性能优化的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • React useState超详细讲解用法

    React useState超详细讲解用法

    我正在处理的组件是表单的时间输入。表单相对复杂,并且是动态生成的,根据嵌套在其他数据中的数据显示不同的字段。我正在用useReducer管理表单的状态,到目前为止效果很好
    2022-11-11
  • 修复Next.js中window is not defined方法详解

    修复Next.js中window is not defined方法详解

    这篇文章主要为大家介绍了修复Next.js中window is not defined方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论