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

React Table如何设置默认按New Cases列排序且仅指定列可切换排序

React Table 自定义排序实现方法

两个需求都可以通过React Table内置配置项实现,无需编写额外自定义排序逻辑,具体修改步骤如下:

  • 列权限配置:控制哪些列支持用户点击排序
  • 初始状态配置:设置表格首次加载的默认排序规则
  • 渲染逻辑优化:避免禁用排序的列出现可点击交互

1. 列配置:控制列的排序权限

useSortBy默认给所有列开启点击排序能力,只需在不需要支持排序的列配置中添加disableSortBy: true,即可禁用对应列的排序切换交互,修改后的列配置如下:

export const COLUMNS = [
    {
        Header : 'Total Cases',
        accessor : 'totalcases',
        disableSortBy: true // 禁用用户点击排序
    },
    {
        Header : 'Active Cases',
        accessor : 'activecases'
        // 不配置disableSortBy,默认支持排序
    },
    {
        Header : 'Total Recovery',
        accessor : 'recovery'
        // 支持排序
    },
    {
        Header : 'Total Death',
        accessor : 'deaths',
        disableSortBy: true // 禁用排序
    },
    {
        Header : 'New Cases',
        accessor : 'newcases',
        disableSortBy: true // 仅作为默认排序列,禁止用户手动切换排序
    },
]

2. 全局配置:设置初始默认排序

调用useTable时传入initialState参数,在其中配置sortBy数组即可指定表格初始渲染时的排序规则,数组项的id对应列的accessor值,desc设为true是降序、false是升序,数值类统计场景默认用降序即可。

3. 渲染层修复

表头渲染时,对禁用排序的列不绑定getSortByToggleProps事件,同时调整鼠标样式,避免用户误以为可以点击。另外注意原代码中data的useMemo依赖数组为空,会导致外部传入的countryData更新时表格不重渲染,需要把countryData加入依赖项。


完整修改后的组件代码

import { useMemo } from 'react';
import { useTable, useGlobalFilter, useSortBy } from 'react-table';
import GlobalFilter from './GlobalFilter'; // 你已实现的全局搜索组件

export const COLUMNS = [
    {
        Header : 'Total Cases',
        accessor : 'totalcases',
        disableSortBy: true
    },
    {
        Header : 'Active Cases',
        accessor : 'activecases'
    },
    {
        Header : 'Total Recovery',
        accessor : 'recovery'
    },
    {
        Header : 'Total Death',
        accessor : 'deaths',
        disableSortBy: true
    },
    {
        Header : 'New Cases',
        accessor : 'newcases',
        disableSortBy: true
    },
] 

function Table({countryData}) {

    const columns = useMemo(()=> COLUMNS, []);
    // 修复原代码依赖缺失问题
    const data = useMemo(()=> countryData, [countryData]);

    const {
        getTableProps,
        getTableBodyProps,
        headerGroups,
        rows,
        prepareRow,
        state,
        setGlobalFilter,
    } =  useTable({
        columns,
        data,
        // 新增初始排序配置:默认按New Cases列降序排列
        initialState: {
            sortBy: [
                {
                    id: 'newcases',
                    desc: true
                }
            ]
        }
    }, useGlobalFilter, useSortBy);

    const { globalFilter } = state;

    return (
        <>
        <GlobalFilter filter={globalFilter} setFilter={setGlobalFilter}/>
        <table {...getTableProps()}>
            <thead>
                {headerGroups.map(headerGroup => (
                     <tr {...headerGroup.getHeaderGroupProps()}>
                        {headerGroup.headers.map(column => (
                            <th 
                                {...column.getHeaderProps(
                                    // 仅可排序列绑定排序切换事件
                                    column.disableSortBy ? {} : column.getSortByToggleProps()
                                )}
                                style={{ cursor: column.disableSortBy ? 'default' : 'pointer' }}
                            >
                                {column.render('Header')}
                                {/* 可选:显示当前排序方向标识 */}
                                <span style={{marginLeft: 4}}>
                                    {column.isSorted ? (column.isSortedDesc ? '↓' : '↑') : ''}
                                </span>
                            </th>
                        ))}
                    </tr>
                ))}
            </thead>
            <tbody {...getTableBodyProps()}>
                {rows.map((row) => {
                    prepareRow(row)
                    return (
                        <tr {...row.getRowProps()}>
                            {row.cells.map(cell => {
                                return <td {...cell.getCellProps()}>{cell.render('Cell')}</td>
                            })}
                        </tr>
                    )
                })}
            </tbody>
        </table>
        </>
    )
}

export default Table

配置说明

  • disableSortBy是列级配置,仅阻止用户手动触发该列的排序切换,不会影响代码层面设置的初始排序规则
  • initialState.sortBy支持配置多列排序,数组项的顺序就是排序优先级,比如先按A列排序,A列值相同的再按B列排序
  • 初始排序的升降序可以根据业务需求调整,确诊、新增这类数据一般默认降序展示数值最大的项在最前

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.19 16:15:46