Refine项目教程:使用Mantine UI添加列表页面

Refine项目教程:使用Mantine UI添加列表页面

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

前言

在Refine项目中,CRUD(创建、读取、更新、删除)功能是构建管理后台的核心部分。本教程将详细介绍如何使用Mantine UI组件库手动创建列表页面,而不是依赖自动生成的代码。通过手动创建,开发者可以获得更大的灵活性和控制权。

准备工作

在开始之前,请确保你已经:

  1. 完成了Refine项目的基本配置
  2. 安装了必要的依赖包,包括Mantine UI组件库
  3. 了解基本的React和TypeScript知识

创建列表页面文件

首先,我们需要在项目中创建列表页面的基础结构:

  1. src/pages/blog-posts目录下创建list.tsx文件
  2. 这个文件将包含我们的博客文章列表组件

理解列表页面的核心组件

1. List组件

<List/>是Refine提供的高阶组件,它提供了以下功能:

  • 页面标题显示
  • 创建新记录的按钮
  • 布局容器
  • 分页控制

2. Table组件

Mantine的<Table/>组件用于展示数据表格,它提供了:

  • 响应式布局
  • 可定制的样式
  • 排序功能
  • 行选择功能

3. useTable钩子

useTable是Refine提供的强大钩子,它结合了:

  • 数据获取功能
  • 分页管理
  • 排序控制
  • 筛选功能

这个钩子内部使用了TanStack Table v8,提供了丰富的表格功能。

处理关联数据

在实际应用中,数据往往存在关联关系。在我们的例子中,每篇博客文章都关联到一个分类。为了高效地获取这些关联数据,我们可以使用useMany钩子。

useMany钩子的工作原理

  1. 首先从主资源(blog_posts)获取数据
  2. 提取所有关联ID(这里是分类ID)
  3. 通过单个请求批量获取所有关联记录
  4. 将关联数据映射到主数据中

这种方法比逐个获取关联数据高效得多,减少了网络请求次数。

实现步骤详解

1. 创建基本列表结构

import { List, useTable } from "@refinedev/mantine";
import { Table } from "@mantine/core";

export const BlogPostList = () => {
  const { getInputProps, ...tableProps } = useTable({
    columns,
    refineCoreProps: {
      metaData: {
        fields: ["id", "title", "content", "category"],
      },
    },
  });

  return (
    <List>
      <Table {...tableProps} striped highlightOnHover>
        {/* 表格内容 */}
      </Table>
    </List>
  );
};

2. 定义表格列

const columns = [
  {
    key: "id",
    header: "ID",
    accessorFn: (row) => row.id,
  },
  {
    key: "title",
    header: "标题",
    accessorFn: (row) => row.title,
  },
  // 其他列定义...
];

3. 处理分类关联数据

const { data: categories } = useMany({
  resource: "categories",
  ids: tableProps.data?.map((post) => post.category.id) ?? [],
});

const categoryColumns = {
  key: "category",
  header: "分类",
  accessorFn: (row) => {
    const category = categories?.data?.find(
      (item) => item.id === row.category.id
    );
    return category?.title;
  },
};

添加到应用路由

完成列表组件后,需要将其添加到应用路由中:

  1. App.tsx中导入列表组件
  2. 替换原有的Inferencer组件
  3. 确保路由路径正确配置
import { BlogPostList } from "pages/blog-posts/list";

// 在路由配置中
<Route path="blog-posts">
  <Route index element={<BlogPostList />} />
  {/* 其他路由... */}
</Route>

最佳实践建议

  1. 分页处理:对于大量数据,确保实现合理分页
  2. 性能优化:使用React.memo优化表格行组件
  3. 错误处理:添加适当的错误边界和加载状态
  4. 可访问性:确保表格符合无障碍标准
  5. 响应式设计:考虑在不同屏幕尺寸下的显示效果

常见问题解决

  1. 数据不显示:检查API端点是否正确,网络请求是否成功
  2. 关联数据缺失:确认useMany的ids参数是否正确传递
  3. 样式问题:检查Mantine主题配置是否正确加载
  4. 分页异常:验证useTable的分页参数是否配置正确

总结

通过本教程,我们学习了如何在Refine项目中手动创建列表页面,而不是依赖自动生成的代码。这种方法虽然需要更多的工作量,但提供了更大的灵活性和控制权。我们重点介绍了:

  • 核心组件的使用(List, Table)
  • 数据获取和状态管理(useTable)
  • 关联数据处理(useMany)
  • 路由配置

掌握这些知识后,你可以创建更复杂、更符合业务需求的列表页面,为后续的CRUD操作打下坚实基础。

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、付费专栏及课程。

余额充值