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

react-table v7.8.0多列排序异常:仅date列生效问题排查

React Table v7.8.0 多列排序仅单列生效问题修复

问题描述

使用react-table v7.8.0创建4列表格,期望实现date和views列的多列排序,但目前仅date列排序生效,分页和手动排序功能正常,已参照官方文档配置但问题未解决。

核心原因

你在Table组件的initialState中设置了manualSortBy: true,这会让react-table放弃自动处理排序逻辑,转而由开发者手动根据sortBy状态实现排序逻辑。但当前代码中并未实现手动模式下的多列排序逻辑,仅依赖初始sortBy配置,导致后续多列排序操作无法生效。

同时,date列使用了格式化后的字符串作为排序依据,字符串排序会导致日期排序逻辑错误,需要改用原始日期对象进行排序。

修复步骤

1. 调整数据结构,保留原始日期对象

修改ViewsPageDayTable.js中处理date字段的逻辑,新增rawDate字段存储原始日期对象,用于排序:

// 在处理date的分支中添加
if (j === "date") {
  var date = new Date(data[i][j])
  dataRow["date"] = date.toLocaleDateString(siteMetadata.locale, postDateTemplate)
  dataRow["rawDate"] = date; // 新增原始日期对象,用于排序计算
}

2. 更新列配置,使用原始日期排序

修改ViewsPageDayTable.js中的columns配置,让date列使用rawDate作为排序依据,同时保持渲染格式化后的日期:

{
  Header: "Date",
  accessor: "rawDate", // 指向原始日期对象
  Cell: ({ value }) => value.toLocaleDateString(siteMetadata.locale, postDateTemplate), // 渲染格式化后的日期
  sortType: (a, b) => {
    return new Date(b) - new Date(a)
  },
},

3. 实现手动多列排序逻辑

修改Table.js,添加手动排序逻辑,根据sortBy状态对数据进行多列排序:

// 在Table组件中,先获取sortBy状态
const {
  getTableProps,
  getTableBodyProps,
  headerGroups,
  page,
  prepareRow,
  setFilter,
  canPreviousPage,
  canNextPage,
  pageOptions,
  nextPage,
  previousPage,
  state: { pageIndex, pageSize, sortBy }, // 新增sortBy
} = useTable(...)

// 手动根据sortBy数组中的规则排序数据
const sortedData = useMemo(() => {
  let sorted = [...data];
  // 按排序规则依次处理每一列
  sortBy.forEach((sortRule) => {
    sorted.sort((rowA, rowB) => {
      const column = columns.find(col => col.accessor === sortRule.id);
      if (!column) return 0;

      // 处理自定义sortType或基础排序
      if (column.sortType && column.sortType !== 'basic') {
        const sortResult = column.sortType(rowA[sortRule.id], rowB[sortRule.id]);
        return sortRule.desc ? -sortResult : sortResult;
      } else {
        // 基础排序逻辑
        if (rowA[sortRule.id] < rowB[sortRule.id]) return sortRule.desc ? 1 : -1;
        if (rowA[sortRule.id] > rowB[sortRule.id]) return sortRule.desc ? -1 : 1;
        return 0;
      }
    });
  });
  return sorted;
}, [data, columns, sortBy]);

4. 更新useTable配置,传入排序后的数据

修改Table.js中useTable的参数,将data替换为sortedData,并更新初始sortBy的id为rawDate:

useTable(
  {
    columns,
    data: sortedData, // 传入手动排序后的数据
    initialState: {
      defaultCanSort: true,
      disableSortBy: false,
      manualSortBy: true,
      sortBy: useMemo(
        () => [
          {
            id: "rawDate", // 对应date列的accessor
            desc: false,
          },
          {
            id: "views",
            desc: true,
          },
        ],
        []
      ),
      pageIndex: 0,
      pageSize: 15,
      manualPagination: true,
    },
  },
  useFilters,
  useSortBy,
  usePagination
)

多列排序操作说明

react-table默认支持按住Shift键点击表头,添加多列排序规则,点击已排序的表头可切换升降序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:20:43