首页 > 其他分享 >二次封装antd的ProTable、EditableProTable,结合use-antd-resizable-header,做一个列可伸缩的表格组件

二次封装antd的ProTable、EditableProTable,结合use-antd-resizable-header,做一个列可伸缩的表格组件

时间:2024-07-18 09:25:45浏览次数:15  
标签:use DragTable resizable ProTable EditableProTable import antd columns

原先是一个项目模块内需求,迭代的时候领导要求项目全面翻新,所有表格都要可伸缩列

如果一个一个页面写伸缩列的话,每个页面都要引用一次use-antd-resizable-header,有点累赘

找了网上,暂时没看见这个有人整理这个组件。

直接上代码

import ProTable from "@ant-design/pro-table";
import { Tooltip } from "antd";
import { connect } from "dva";
import React, { useMemo } from "react";
import { useAntdResizableHeader } from "use-antd-resizable-header";


export interface DragTableProps {
  tableProps: any // 表格属性
  active?: Boolean // 是否动态列
  rbac?: any // 权限
  tableHeght?: number // 表格高度,针对一些弹窗表格
}

const DragTable: React.FC<DragTableProps> = props => {
  const {
    tableProps,
    active,
    rbac,
    tableHeght
  } = props

  const { columns, ...rest } = tableProps

  const { components: proComponents, resizableColumns: proResizableColumns, tableWidth: proTableWidth, resetColumns: proResetColumns } = useAntdResizableHeader({
    columns: active ? useMemo(() => columns, [rbac, columns]) : useMemo(() => columns, [rbac]),
    tooltipRender: (props) => <Tooltip {...props} />,
    maxConstraints: 400
  })

  return (
    <>
      <ProTable
        bordered
        columns={proResizableColumns}
        components={proComponents}
        scroll={{
          x: proTableWidth,
          y: tableHeght ? tableHeght : null
        }}
        options={{
          density: false,
          fullScreen: false,
          reload: false,
          setting: true
        }}
        {...rest}
      />
    </>
  )
}

export default connect(() => ({}))(DragTable);

因为我们项目内有动态列的需求,如果你没有这一块需求,可以把active相关代码去掉

ProTable里面比较固定的属性可以直接写在组件里面,这样就不用每一次引用组件都写了

在页面上使用组件

import DragTable from '@/pages/components/DragTable'
<DragTable
  tableProps={{
  headerTitle: "对码",
  rowKey: "id",
  size: "small",
  actionRef: actionRef,
  dataSource: dataList,
  columns: columns,
  loading: loading,
  onSubmit: (params: any) => getMatchingCodesData(params),
  onReset: () => { resetBtn() },
  search: false,
  rowSelection: {
    selectedRowKeys: id,
    onChange: handleRowSelectionChange
  },
  toolBarRender: () => [],
  pagination: {
    current: queryParam.page,
    pageSize: queryParam.size,
    showSizeChanger: true,
    showQuickJumper: true,
    pageSizeOptions: [15, 30, 50, 100],
    size: 'small',
    onChange: getMatchingCodesData,
    showTotal: () => `共 ${total || 0} 条`,
    total: total
  }
 }}
/>

相关的属性参数都可以按照自己的需求来

这里提一嘴,经过尝试,EditableProTable也可以调用这个组件,不需要重新写一个,因为EditableProTable和ProTable虽然标签不一样,但是里面的属性大部分都是一样的,EditableProTable的api也可以在ProTable标签里面使用,只要调用DragTable的时候加上EditableProTable相关的编辑api就行了。

标签:use,DragTable,resizable,ProTable,EditableProTable,import,antd,columns
From: https://blog.csdn.net/m0_56298143/article/details/140512797

相关文章

  • ClickHouse集成LDAP实现简单的用户认证
    1.这里我的ldap安装的是docker版的docker安装的化就yum就好了sudoyuminstalldocker-cedocker-ce-clicontainerd.iodocker-buildx-plugindocker-compose-pluginsudosystemctlstartdocker使用下面的命令验证sudodockerrunhello-worlddockerpullosixia/open......
  • useHeadSafe:安全生成HTML头部元素
    title:useHeadSafe:安全生成HTML头部元素date:2024/7/17updated:2024/7/17author:cmdragonexcerpt:摘要:“useHeadSafe”是Vue.js组合函数,用于安全生成HTML头部元素,通过限制输入值格式避免XSS等安全风险,提供了安全值白名单确保只有安全属性被添加。categories:前端开......
  • F. Vitaly and Advanced Useless Algorithms
    原题链接题解,没有思路的时候先想想暴力1.观察观察再观察,对于每个计划而言,所完成的任务是唯一的,所以要完成任务\(c\),相当于在能完成\(c\)的计划集合里,选择若干个计划,使得其总耗时最小,且完成的超过1002.这种包含两种属性限制的集合选择,不难想到背包,即相同耗时,记录完成度高的,......
  • 火山引擎ByteHouse发布高性能全文检索引擎
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群。 随着数字时代的发展,数据的来源和生成方式越来越广泛,数据形态也愈加丰富。 以某电商平台的数据情况举例。该电商平台每日产生大量数据,有些为电商平台的订单数据,包括订单号、商品数量、......
  • 端口被占用如何处理Error: listen EADDRINUSE: address already in use :::xxxx
    启动项目出现Error:listenEADDRINUSE:addressalreadyinuse:::9088yarnrunv1.22.19$nodesrc/index.jsevents.js:377thrower;//Unhandled'error'event^Error:listenEADDRINUSE:addressalreadyinuse:::9088atServer.setupL......
  • CodeForces 1992A Only Pluses
    题目链接:CodeForces1992A【OnlyPluses】思路    代码#include<functional>#include<iostream>#include<algorithm>#include<queue>usingnamespacestd;#definelllonglongconstintN=500+10;inta[N];voidsolve(){intn......
  • Camunda流程运行中,需要更换UserTask的被订阅者
    主要应用于实际开发中,考虑到会有人员调动的情况publicvoidchangeManager(Stringoriginal,Stringnow,StringvariableName){//当前任务授予人替换List<Task>list=taskService.createTaskQuery().taskAssignee(original).list();list.strea......
  • 深入理解 React 的 useSyncExternalStore Hook
    深入理解React的useSyncExternalStoreHook大家好,今天我们来聊聊React18引入的一个新Hook:useSyncExternalStore。这个Hook主要用于与外部存储同步状态,特别是在需要确保状态一致性的场景下非常有用。本文将深入探讨这个Hook的使用场景、工作原理,并通过代码示例来帮助大......
  • 「杂题乱刷2」CF1015D Walking Between Houses
    duel到的。题目链接CF1015DWalkingBetweenHouses解题思路一道细节题。思路很简单,肯定是一开始能走的越多越好,因此就有一种较好实现的方案,先每次走\(n-1\)格,但由于每次至少要走一格,因此如果不够走了就把能走的都走掉,之后全走\(1\)步即可。时间复杂度\(O(k)\)。参......
  • Nuxt.js 错误侦探:useError 组合函数
    title:Nuxt.js错误侦探:useError组合函数date:2024/7/14updated:2024/7/14author:cmdragonexcerpt:摘要:文章介绍Nuxt.js中的useError组合函数,用于统一处理客户端和服务器端的错误,提供statusCode、statusMessage和message属性,示例展示了如何在组件中使用它来捕获和显......