Ant Design Pro(5)-7.高级表格ProTable

news2025/1/24 8:50:53

Ant Design Pro 高级表格ProTable的使用

文章目录

    • Ant Design Pro 高级表格ProTable的使用
      • 一. 简介
        • 1. 什么是ProTable?
        • 2. 何时使用ProTable?
      • 二. 使用
        • 1. ProTable属性及使用
        • 2. ActionRef 手动触发
        • 3. Columns 列定义
        • 4. 批量操作
        • 5. 搜索表单


一. 简介

1. 什么是ProTable?

ProTable 的诞生是为了解决项目中需要写很多 table 的样板代码的问题,所以在其中做了封装了很多常用的逻辑。这些封装可以简单的分类为预设行为与预设逻辑。

依托于 ProForm 的能力,ProForm 拥有多种形态,可以切换查询表单类型,设置变形成为一个简单的 Form 表单,执行新建等功能。

2. 何时使用ProTable?

当你的表格需要与服务端进行交互或者需要多种单元格样式时,ProTable 是不二选择。

二. 使用

1. ProTable属性及使用

  1. request的使用

request 是 ProTable 最重要的 API,request 会接收一个对象。对象中必须要有 data 和
success,如果需要手动分页 total 也是必需的。request 会接管 loading 的设置,同时在查询表单查询和 params 参数发生修改时重新执行。同时 查询表单的值和 params 参数也会带入。以下是一个例子:

<ProTable<DataType, Params>
  // params 是需要自带的参数
  // 这个参数优先级更高,会覆盖查询表单的参数
  params={params}
  request={async (
    // 第一个参数 params 查询表单和 params 参数的结合
    // 第一个参数中一定会有 pageSize 和  current ,这两个参数是 antd 的规范
    params: T & {
      pageSize: number;
      current: number;
    },
    sort,
    filter,
  ) => {
    // 这里需要返回一个 Promise,在返回之前你可以进行数据转化
    // 如果需要转化参数可以在这里进行修改
    const msg = await myQuery({
      page: params.current,
      pageSize: params.pageSize,
    });
    return {
      data: msg.result,
      // success 请返回 true,
      // 不然 table 会停止解析数据,即使有数据
      success: boolean,
      // 不传会使用 data 的长度,如果是分页一定要传
      total: number,
    };
  }}
/>
  1. dataSource

Table 的数据,protable 推荐使用 request 来加载,类型是一个数组T【】

  <ProTable<API.CreateClusterParams>
        columns={columns}
        // dataSource会将
        dataSource={list}
        request={async (params = {}, sort, filter) => {
            // 这里是我自定义的一个带参数的方法
            handleClick(params);
            return {
                dataSource:data
            }
          }}
        pagination={{
          defaultPageSize: 10,
          showSizeChanger: true,
        }}
      >
      </ProTable>

其它属性使用请参考官方文档:ProTable属性及使用

2. ActionRef 手动触发

有时我们要手动触发 table 的 reload 等操作,可以使用 actionRef,可编辑表格也提供了一些操作来帮助我们更快的实现需求。

interface ActionType {
  reload: (resetPageIndex?: boolean) => void;
  reloadAndRest: () => void;
  reset: () => void;
  clearSelected?: () => void;
  startEditable: (rowKey: Key) => boolean;
  cancelEditable: (rowKey: Key) => boolean;
}

const ref = useRef<ActionType>();

<ProTable actionRef={ref} />;

// 刷新
ref.current.reload();

// 刷新并清空,页码也会重置,不包括表单
ref.current.reloadAndRest();

// 重置到默认值,包括表单
ref.current.reset();

// 清空选中项
ref.current.clearSelected();

// 开始编辑
ref.current.startEditable(rowKey);

// 结束编辑
ref.current.cancelEditable(rowKey);

3. Columns 列定义

详情请参考官方文档:Columns 列定义
具体如何使用可以参考后面我写的完整的页面

import { ModalForm, ProColumns, ProFormText, ProFormTextArea, ProTable } from '@ant-design/pro-components';
import { useEffect, useState } from 'react';
import { Button, message, Space } from 'antd';
import AddCluster from "@/pages/System/ClusterManagement/components/AddCluster";
import { pageQueryCluster } from "@/services/ant-design-pro/test";
import { request } from '@umijs/max';


const columns: ProColumns<API.CreateClusterParams>[] = [

    {
        title: 'ID',
        dataIndex: 'id',
    },
    {
        title: '名称',
        dataIndex: 'name',
    },
    {
        title: '操作',
        key: 'option',
        width: 120,
        valueType: 'option',
        render: (_, row) => [

            <Space>
                <ModalForm
                    title="编辑"
                    trigger={<Button type="primary">编辑</Button>}
                    // form={row}
                    autoFocusFirstInput
                    modalProps={{
                        destroyOnClose: true,
                        onCancel: () => console.log('run'),
                    }}
                    submitTimeout={2000}
                    onFinish={async (values) => {
                        console.log(values.name);
                        return true;
                    }}
                >
                    <ProFormText width="md" name="id" label="ID" placeholder="请输入id" initialValue={row.id} />
                    <ProFormText width="md" name="name" label="名称" placeholder="请输入名称" initialValue={row.name} />
                    <Button type="primary">
                        测试配置连接
                    </Button>

                </ModalForm>
            </Space>,

            <Space>
                <ModalForm
                    title="确定要删除吗?"
                    trigger={<Button type="primary" danger>删除</Button>}
                    // form={row}
                    autoFocusFirstInput
                    modalProps={{
                        destroyOnClose: true,
                        onCancel: () => console.log('run'),
                    }}
                    submitTimeout={2000}
                    onFinish={async (row) => {
                        message.success('提交成功');
                        return true;
                    }}
                >
                </ModalForm>
            </Space>,
        ],

    },
]

// 在数据为返回前显示这里的数据
const data =
    [
        {
            id: '1',
            name: '测试集群1',
        },
        {
            id: '2',
            name: '测试集群2',
        },
    ];
const pageParams = {
    pageSize: 10,
    pageNumber: 1
};

export default () => {
    const [list, setData] = useState(data);
    const handleClick = async (props: any) => {
        const respone = await pageQueryCluster(props)
        console.log("获取后台数据", respone)
        if (respone.code = '200') {
            setData(respone.data.items);
        } else {
            setData(data);
        }
        console.log(respone)
    }
    useEffect(() => {
        handleClick(pageParams);
    }, [])
    return (
        <div className='proTable'>
            <AddCluster />
            <ProTable<API.CreateClusterParams>
                columns={columns}
                dataSource={list}
                request={async (params = {}, sort, filter) => {
                    handleClick(params);
                    return {
                        dataSource: data
                    }
                }}
                pagination={{
                    defaultPageSize: 10,
                    showSizeChanger: true,
                }}
            >
            </ProTable>
        </div>
    );
};


4. 批量操作

与 antd 相同,批量操作需要设置 rowSelection 来开启,与 antd 不同的是,pro-table 提供了一个 alert用于承载一些信息。你可以通过 tableAlertRender和 tableAlertOptionRender来对它进行自定义。设置或者返回 false 即可关闭。

属性描述类型默认值
alwaysShowAlert总是展示 alert,默认无选择不展示(rowSelection内置属性)boolean-
tableAlertRender自定义批量操作工具栏左侧信息区域, false 时不显示({ selectedRowKeys: Key[], selectedRows: T[], onCleanSelected: ()=>void }) => ReactNode)/false-
tableAlertOptionRender自定义批量操作工具栏右侧选项区域, false 时不显示({ selectedRowKeys: Key[], selectedRows: T[], onCleanSelected: ()=>void }) => ReactNode)/false

具体使用参考如下链接:table表格批量操作

5. 搜索表单

ProTable 会根据列来生成一个 Form,用于筛选列表数据,最后的值会根据通过 request 的第一个参数返回,看起来就像。

搜索表单有两种类型:

  1. 一种是带搜索框的,组件默认开启,也可手动开启。
  search={{
          labelWidth: 'auto',
        }}

页面效果如下:

在这里插入图片描述

  1. 一种是轻量筛选替换查询,开启方式如下:
  search={{
          filterType: 'light',
         }}

页面效果如下:

在这里插入图片描述

如果组件自带的搜索功能不满足我们的需求,我们也可以自定义搜索表单,具体如何使用请参考如下链接:搜索表单自定义

其他更多细节和详情参考:ProComponents官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/407967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】父子组件通信

[Vue]父子组件通信前言父组件向子组件传值法一: props法二: $parent子组件向父组件传值$emit$emit .sync$refsv-model前言 &#x1f6a9;&#x1f6a9;&#x1f6a9; &#x1f48e;个人主页: 阿选不出来 &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;个人简介: 一名…

【Javaweb】会话跟踪技术CookieSession

学习目录前言一.会话引入二.Cookie1.Cookie的理解2.Cookie生命周期3.Cookie有效路径4.Cookie使用细节三.Session1.Session基本原理2.Session的理解3.Session基本使用4.Session底层5.Session生命周期前言 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.会话引入 什么是会话&a…

“Property or method “***“ is not defined on the instance but referenced during render.”报错的原因及解决方案

报错问题&#xff1a; 在使用vue-cli运行项目的过程中&#xff0c;在VScode中不报错&#xff0c;但在浏览器调试工具中发出 [Vue warn]: Property or method "******" is not defined on the instance but referenced during render. Make sure that this propert…

vue-day01 使用cdn引入使用

vue-day01vue?vue简明例子模板语法1. 使用{{}} Mustache语法将数据绑定到对应的实例2.使用 v-once指令3.v-html指令4.v-bind指令和v-on指令5.动态参数&#xff0c;修饰符&#xff0c;指令缩写动态参数修饰符指令缩写vue? Vue 是一套用于构建用户界面的渐进式框架。与其它大型…

前端不使用 i18n,如何优雅的实现多语言?

前言&#xff1a; 关于ERP管理系统的多语言&#xff0c;或者其他应用的多语言一直是我们比较麻烦的问题&#xff0c;大部分是使用 i18n 在代码里进行配置&#xff0c;如果想要修改语言就要自己去改代码&#xff01; 今天我们分享一下如何不使用 i18n 去实现多语言&#xff0c;用…

web前端面试高频考点——Vue的基本使用(一文掌握Vue最基础的知识点)

系列文章目录 内容参考链接Vue基本使用Vue的基本使用&#xff08;一文掌握Vue最基础的知识点&#xff09;Vue通信和高级特性Vue组件间的通信及高级特性&#xff08;多种组件间的通信、自定义v-model、nextTick、插槽&#xff09;Vue高级特性Vue的高级特性&#xff08;动态组件…

ES6遍历方法,forEach、for...in,for..of

前言 js中遍历方法很多&#xff0c;在ES6新特性中出现了很多新的遍历方法&#xff0c;使遍历数组和对象更加方便&#xff0c;下面开始列举各种方法。 1.遍历对象 1.1.for…in…循环遍历对象自身和继承的可枚举的属性&#xff08;不包括Symbol&#xff0c;因为symbol的实例是…

微信小程序开发入门与实战(数据、事件、条件)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

layui 的数据表单的defaultToolbar参数中筛选列,图标,打印,三个功能,调用单独拿出使用

项目场景&#xff1a; 参数之defaultToolbar&#xff1a; 在使用layui开发的过程中&#xff0c;常常会用到 数据表单 这一关键模块&#xff0c;在这里讲一下defaultToolbar:[filter,exports print]-------“头部工具栏右侧图标”&#xff0c;如何将这三个按钮调用出来&#x…

【vscode】vscode常用插件介绍

1、Angular Snippets&#xff08;angular片段&#xff09; 这个扩展为 TypeScript 和 HTML 添加了 Angular 的代码片段。 2、Auto Close Tag&#xff08;自动闭合标签&#xff09; 自动添加 HTML/XML 关闭标记。 3、Auto Rename Tag&#xff08;自动重命名标签&#xff09; 自…

Three.js基础入门系列(九)--导入3D模型

先来学习今天的知识——Three.js导入3D模型 复杂的3D模型&#xff08;比如制作一个飞机模型&#xff09;一般都是用第三方建模工具生成&#xff0c;然后加载到Three.js中。 01 常用建模制作工具 3Dmax 链接地址&#xff1a;https://www.autodesk.com.cn/products/3ds-max/over…

启动vue-element-admin 安装npm install报错npm ERR! code 128npm ERR! An unknown git error occurre

使用vue-element-admin前端项目&#xff0c;前提是有nodejs环境&#xff0c;对于此环境的安装可以参考网上的博客。此博客用于记录启动项目以及遇到的问题、并解决问题的过程。1、介绍vue-element-admin是基于element-ui 的一套后台管理系统集成方案 。功能&#xff1a;https:/…

Vue基础教程(下篇)

&#x1f60a;作者简介&#xff1a;大家好&#xff0c;我是是你的大头呢&#xff0c;一名大三学生&#xff0c;考研备考中。让我们一起加油&#xff0c;一起努力&#xff01; &#x1f9d1;‍&#x1f4bb;博客主页&#xff1a;是你的大头呢 &#x1f970;欢迎关注&#x1f38a…

javascript 中搜索数组的四种方法

前端经常要通过 javaScript 来处理数组中的数据&#xff0c;其中就包括检查数组中是否包含满足特定搜索条件的单个或者多个值&#xff0c;这就需要我们关于用于确认的布尔值、数组中值得位置索引或包含所有搜索结果的单独数组等。 在 ECMAScript6 之前&#xff0c;最常用的方法…

Vue中 this.$set的用法

一、this.$set能够实现什么功能 官方解释&#xff1a;向响应式对象中添加一个属性&#xff0c;并确保这个新属性同样是响应式的&#xff0c;且触发视图更新。它必须用于向响应式对象上添加新属性&#xff0c;因为 Vue无法探测普通的新增属性 (比如 this.myObject.newProperty …

pdf在线预览 pdf.js的使用

1.官网&#xff1a;https://mozilla.github.io/pdf.js/ 2、使用方法 1&#xff09; 通过官网&#xff0c;下载pdfJs插件包&#xff0c;放至项目中&#xff1b; window.open("./js/pdfJS/web/viewer.html?fileAngularJS权威指南.pdf" );2&#xff09;将下载的pdfJS…

uniapp封装axios?大可不必那么麻烦。

最近群里的一个小明同学问 uniapp可以使用axios请求吗&#xff1f;我当时就一愣 反问为什么要使用axios&#xff0c;是 uni.request 不香了吗&#xff1f; 小明&#xff1a;因为axios可以像vue的项目一样&#xff0c;在request里面封装巴拉巴拉一堆。 我&#xff1a;那uni.re…

微信小程序开发使用onreachBottom实现页面触底加载及分页

目录 一 简要介绍一下onreachBottom事件 二 实例展示 三 遇到的一些问题 一 简要介绍一下onreachBottom事件 onreachBottom和onLoad以及onShow一样&#xff0c;都属于小程序的生命周期事件&#xff0c;作用就是在页面下拉到底部时触发这个事件&#xff0c;一般适用于数据比较…

一次跨域的坑Faild to load response data: No resourse with given identifier found

有一个导出接口&#xff0c;前后端都没有动过&#xff0c;之前也测试过没有问题。上到测试环境后&#xff0c;测试环境加了证书&#xff0c;报错了。 先是后端小朋友和我说了这个问题&#xff1a; 浏览器控制台打印信息(聊天记录中那张图)&#xff1a;然后我问他操作了哪个页面…

vue3.0教程——搭建Vue脚手架【简化版】

目录 哈喽&#xff0c;大家好丫&#xff0c;你们的小郭子又来啦 ~ 一、环境要求 &#xff08;1&#xff09;node安装&#xff08;前端开发环境&#xff09; &#xff08;2&#xff09;vue-cli脚手架安装 二、安装依赖 &#xff08;1&#xff09;使用命令行安装以下依赖 &a…