Refine项目教程:使用Mantine为CRUD页面添加排序和过滤功能

Refine项目教程:使用Mantine为CRUD页面添加排序和过滤功能

refine 一个用于构建内部工具、管理面板、仪表盘和B2B应用程序的React框架,具有无与伦比的灵活性。 refine 项目地址: https://gitcode.com/gh_mirrors/re/refine

前言

在现代Web应用中,数据表格的排序和过滤功能是提升用户体验的关键特性。本文将详细介绍如何在Refine项目中,结合Mantine UI组件库,为CRUD页面实现强大的排序和过滤功能。

技术背景

Refine是一个基于React的企业级框架,提供了强大的数据管理能力。它内置的@refinedev/react-table包基于流行的TanStack Table(原React Table)构建,可以轻松实现复杂的数据表格功能。

实现排序功能

1. 创建排序按钮组件

首先我们需要创建一个可复用的排序按钮组件ColumnSorter

import { ActionIcon } from "@mantine/core";
import { IconChevronDown, IconSelector, IconChevronUp } from "@tabler/icons";
import type { Column } from "@tanstack/react-table";

export const ColumnSorter: React.FC<{ column: Column<any, any> }> = ({ column }) => {
  if (!column.getCanSort()) {
    return null;
  }

  const sorted = column.getIsSorted();

  return (
    <ActionIcon size="xs" onClick={column.getToggleSortingHandler()}>
      {!sorted && <IconSelector size={18} />}
      {sorted === "asc" && <IconChevronDown size={18} />}
      {sorted === "desc" && <IconChevronUp size={18} />}
    </ActionIcon>
  );
};

这个组件实现了以下功能:

  • 检查列是否可排序(getCanSort()
  • 显示当前排序状态(升序、降序或无排序)
  • 点击时切换排序状态(getToggleSortingHandler()

2. 在表格中集成排序功能

ColumnSorter组件添加到表头中:

<thead>
  {getHeaderGroups().map((headerGroup) => (
    <tr key={headerGroup.id}>
      {headerGroup.headers.map((header) => (
        <th key={header.id}>
          {!header.isPlaceholder &&
            flexRender(
              header.column.columnDef.header,
              header.getContext(),
            )}
          <ColumnSorter column={header.column} />
        </th>
      ))}
    </tr>
  ))}
</thead>

3. 控制列的排序行为

在列定义中,可以控制哪些列可排序:

{
  id: "actions",
  accessorKey: "id",
  header: "Actions",
  enableSorting: false, // 禁用此列排序
}

实现过滤功能

1. 创建过滤组件

过滤功能需要更复杂的交互,我们创建一个ColumnFilter组件:

import React, { useState } from "react";
import { TextInput, Menu, ActionIcon, Stack, Group } from "@mantine/core";
import { IconFilter, IconX, IconCheck } from "@tabler/icons";
import type { Column } from "@tanstack/react-table";

export const ColumnFilter: React.FC<{ column: Column<any, any> }> = ({ column }) => {
  const [state, setState] = useState(null as null | { value: any });

  // 组件实现...
};

这个组件包含以下关键功能:

  • 点击过滤器图标打开下拉菜单
  • 在菜单中渲染过滤输入框
  • 提供"清除"和"应用"按钮
  • 支持自定义过滤组件

2. 集成过滤组件到表格

ColumnFilter添加到表头:

<th key={header.id}>
  {!header.isPlaceholder && flexRender(header.column.columnDef.header, header.getContext())}
  <ColumnSorter column={header.column} />
  <ColumnFilter column={header.column} />
</th>

3. 配置过滤行为

在列定义中配置过滤操作符:

{
  id: "title",
  accessorKey: "title",
  header: "Title",
  meta: {
    filterOperator: "contains", // 使用包含操作符
  },
}

禁用特定列的过滤:

{
  id: "actions",
  accessorKey: "id",
  header: "Actions",
  enableColumnFilter: false, // 禁用此列过滤
}

高级用法:自定义过滤组件

如果需要更复杂的过滤UI,可以自定义过滤组件:

{
  id: "category",
  header: "Category",
  accessorKey: "category.id",
  meta: {
    filterElement: (props) => <Select 
      data={categories} 
      value={props.value} 
      onChange={props.onChange} 
    />,
  },
}

实现原理

Refine的表格功能基于TanStack Table构建,其核心机制是:

  1. 排序和过滤状态由TanStack Table管理
  2. 状态变化时,useTable hook会自动转换这些状态为Refine的CrudSortingCrudFilter类型
  3. 转换后的参数会传递给dataProvidergetList方法
  4. 从服务器获取新数据并更新表格

最佳实践

  1. 性能优化:对于大型数据集,考虑实现服务端排序和过滤
  2. 用户体验:为排序和过滤操作添加加载状态指示
  3. 可访问性:确保所有交互元素都有适当的ARIA属性
  4. 移动端适配:在小屏幕上考虑简化过滤UI

总结

通过本文的步骤,我们成功在Refine项目中实现了:

  • 点击表头进行升序/降序排序
  • 通过下拉菜单进行列过滤
  • 灵活的配置选项控制各列行为
  • 支持自定义过滤UI组件

这些功能显著提升了数据表格的交互性和实用性,为用户提供了更好的数据浏览和探索体验。

refine 一个用于构建内部工具、管理面板、仪表盘和B2B应用程序的React框架,具有无与伦比的灵活性。 refine 项目地址: https://gitcode.com/gh_mirrors/re/refine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虞宜来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值