You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中点击按钮滚动ag-grid固定表格非固定区域的实现方法

实现AG Grid固定列表格的手动水平滚动

嘿,这个需求我之前做过!AG Grid确实没直接提供手动触发滚动的API,但咱们可以通过操作它的DOM元素来实现,完全可行。下面结合固定列的场景给你一步步拆解:

核心思路

AG Grid的非固定列部分被包裹在一个类名为ag-center-cols-container的DOM容器里,这个容器本身支持水平滚动。咱们只需要获取这个容器,然后修改它的scrollLeft属性,就能控制滚动位置了。

React组件中的具体实现

我基于固定列的场景写了个完整示例,你可以直接参考:

import React, { useRef, useEffect } from 'react';
import { AgGridReact } from 'ag-grid-react';
import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-alpine.css';

const PinnedColumnGrid = () => {
  // 指向AG Grid实例的ref
  const gridRef = useRef(null);
  // 指向非固定列滚动容器的ref
  const scrollContainerRef = useRef(null);

  // 组件挂载后获取滚动容器
  useEffect(() => {
    if (gridRef.current?.api) {
      // 通过Grid API获取主体元素,再定位到滚动容器
      const gridBody = gridRef.current.api.getGridBodyElement();
      scrollContainerRef.current = gridBody.querySelector('.ag-center-cols-container');
    }
  }, []);

  // 向左滚动逻辑
  const handleScrollLeft = () => {
    if (scrollContainerRef.current) {
      // 每次滚动200px,步长可以自定义
      scrollContainerRef.current.scrollLeft -= 200;
      // 如果想要平滑滚动,可以用下面的写法:
      // scrollContainerRef.current.scrollTo({
      //   left: scrollContainerRef.current.scrollLeft - 200,
      //   behavior: 'smooth'
      // });
    }
  };

  // 向右滚动逻辑
  const handleScrollRight = () => {
    if (scrollContainerRef.current) {
      scrollContainerRef.current.scrollLeft += 200;
      // 平滑滚动版本:
      // scrollContainerRef.current.scrollTo({
      //   left: scrollContainerRef.current.scrollLeft + 200,
      //   behavior: 'smooth'
      // });
    }
  };

  // 固定列配置
  const columnDefs = [
    { field: 'make', pinned: 'left', width: 150 },
    { field: 'model', width: 200 },
    { field: 'year', width: 100 },
    { field: 'color', width: 150 },
    { field: 'price', width: 150 },
    { field: 'fuelType', width: 150 },
    { field: 'transmission', width: 180 },
    { field: 'mileage', width: 150 },
  ];

  const rowData = [
    { make: 'Toyota', model: 'Celica', year: 2020, color: 'Red', price: 35000, fuelType: 'Petrol', transmission: 'Automatic', mileage: 12000 },
    { make: 'Ford', model: 'Mondeo', year: 2019, color: 'Blue', price: 32000, fuelType: 'Diesel', transmission: 'Manual', mileage: 25000 },
    { make: 'Porsche', model: 'Boxster', year: 2021, color: 'Black', price: 72000, fuelType: 'Petrol', transmission: 'Automatic', mileage: 5000 },
  ];

  return (
    <div style={{ padding: '20px' }}>
      {/* 滚动控制按钮 */}
      <div style={{ marginBottom: '10px' }}>
        <button onClick={handleScrollLeft} style={{ padding: '8px 16px' }}>← 向左滚动</button>
        <button onClick={handleScrollRight} style={{ padding: '8px 16px', marginLeft: '10px' }}>向右滚动 →</button>
      </div>
      {/* AG Grid容器 */}
      <div className="ag-theme-alpine" style={{ height: '400px', width: '800px' }}>
        <AgGridReact
          ref={gridRef}
          columnDefs={columnDefs}
          rowData={rowData}
          enableSorting={true}
          enableFilter={true}
        />
      </div>
    </div>
  );
};

export default PinnedColumnGrid;

关键细节说明

  • 精准获取滚动容器:通过gridRef.current.api.getGridBodyElement()获取Grid的主体元素,再用querySelector定位到ag-center-cols-container,比直接用document.querySelector更安全,避免页面存在多个Grid时出现冲突。
  • 自定义滚动步长:示例中用的是200px的固定步长,你也可以根据列的实际宽度动态计算(比如获取某列的宽度后,滚动对应距离),体验会更贴合需求。
  • 平滑滚动优化:注释里的scrollTo方法可以实现平滑滚动效果,只需要把默认的滚动代码替换掉就行。

额外优化建议

你还可以添加边界判断,当滚动容器已经到达最左端或最右端时,禁用对应的按钮,避免无效操作:

// 检查是否可以向左滚动
const canScrollLeft = scrollContainerRef.current?.scrollLeft > 0;
// 检查是否可以向右滚动
const canScrollRight = scrollContainerRef.current?.scrollLeft < (scrollContainerRef.current.scrollWidth - scrollContainerRef.current.clientWidth);

然后在按钮上添加disabled={!canScrollLeft}这类属性即可。

内容的提问来源于stack exchange,提问作者darKnight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:52:05