使用react开发中后台应用时,你是不是也经常会用到☺️


    ProTable--高级表格 - 图1
    通常学会表格的使用,在业务开发中,就可应付50%的中后台管理界面的开发了。
    总结记录一下,可以帮助我们快速的开发啦。

    ProTable--高级表格 - 图2

    proTable 的基础使用

    1. import React, { useState, useRef, useEffect } from 'react'
    2. import type { ProColumns, ActionType } from '@ant-design/pro-table'
    3. import ProTable from '@ant-design/pro-table'
    4. import { debounce } from 'lodash'
    5. // 表头字段
    6. type GithubIssueItem = {
    7. id: number;
    8. case_job_name: string; // 任务名称
    9. case_job_cron: string; // Corn表达式
    10. case_job_start_time: string; // 任务开始时间
    11. case_job_interval_time: number; // 任务间隔
    12. case_job_status: number; // 任务状态
    13. create_user: string; // 负责人
    14. case_id: string; // case id
    15. };
    16. interface SunDayProps {
    17. // props参数类型
    18. }
    19. /**
    20. interface ActionType {
    21. reload: (resetPageIndex?: boolean) => void;
    22. reloadAndRest: () => void;
    23. reset: () => void;
    24. clearSelected?: () => void;
    25. startEditable: (rowKey: Key) => boolean;
    26. cancelEditable: (rowKey: Key) => boolean;
    27. }
    28. // ActionRef 手动触发表格的刷新(例如表格编辑、删除后再次reload)
    29. const ref = useRef<ActionType>()
    30. // 刷新
    31. ref.current.reload();
    32. **/
    33. const SunDay: React.FC<props: SunDayProps> = (props) => {
    34. const ref = useRef<ActionType>()
    35. const columns: ProColumns<GithubIssueItem>[] = [
    36. {
    37. dataIndex: 'index',
    38. valueType: 'indexBorder',
    39. width: 48,
    40. },
    41. {
    42. title: '任务名称',
    43. dataIndex: 'case_job_comment',
    44. copyable: true, // 可复制
    45. ellipsis: true, // 是否自动缩略
    46. filters: true, // 查询条件中显示
    47. editable: false
    48. },
    49. {
    50. title: 'Corn',
    51. dataIndex: 'case_job_cron',
    52. filters: false,
    53. copyable: false,
    54. editable: false,
    55. search: false
    56. },
    57. {
    58. title: '任务开始时间',
    59. dataIndex: 'case_job_start_time',
    60. filters: false,
    61. copyable: false,
    62. editable: false,
    63. search: false
    64. },
    65. {
    66. title: '任务间隔',
    67. dataIndex: 'case_job_interval_time',
    68. filters: false,
    69. copyable: false,
    70. search: false,
    71. editable: false
    72. },
    73. {
    74. title: '任务状态',
    75. dataIndex: 'case_job_status',
    76. filters: true,
    77. search: false,
    78. // eslint-disable-next-line no-nested-ternary
    79. render: (_, row) => row.case_job_status === 0 ? '待执行' : (row.case_job_status === 1 ? '执行中' : (row.case_job_status === 2 ? '执行完成' : (row.case_job_status === 3 ? '待删除' : '已删除')))
    80. },
    81. {
    82. title: '负责人',
    83. dataIndex: 'create_user',
    84. filters: true,
    85. copyable: false,
    86. editable: false
    87. },
    88. {
    89. title: 'case id',
    90. dataIndex: 'case_id',
    91. filters: false,
    92. copyable: false,
    93. search: false,
    94. editable: false
    95. },
    96. {
    97. title: '操作',
    98. valueType: 'option',
    99. render: (text, record, _, action) => [
    100. <a onClick={this.edit}>编辑</a>,
    101. <a onClick={this.delete}>删除</a>
    102. ]
    103. },
    104. ]
    105. // 编辑
    106. const edit = debounce(async (record) => {
    107. const res = await backServe({id: record.id})
    108. if (res.code === 200) {
    109. // ref.current.reload() 刷新
    110. }
    111. }, 500)
    112. // 删除
    113. const delete = debounce(async (record) => {
    114. const res = await backServe({})
    115. if (res.code === 200) {
    116. // ref.current.reload() 刷新
    117. }
    118. }, 500)
    119. return (
    120. <ProTable<GithubIssueItem>
    121. rowKey="id" // antd v3 和 antd v4 有区别哦
    122. headTitle="高级表格"
    123. columns={columns}
    124. actionRef={ref}
    125. request={async (params) => {
    126. // params: T & {
    127. pageSize: number;
    128. current: number;
    129. },
    130. // 第一个参数 params 查询表单和 params 参数的结合
    131. // 第一个参数中一定会有 pageSize 和 current ,这两个参数是 antd 的规范
    132. const { pageSize, current, ...reset } = params
    133. const res = await myQuery({ pageIndex: current, pageSize: pageSize, ...reset })
    134. return {
    135. data: res.result,
    136. success: true, // success 请返回 true, 不然 table 会停止解析数据,即使有数据
    137. total: res.total || 0 // 不传会使用 data 的长度,如果是分页一定要传
    138. }
    139. }}
    140. pagination={{ pageSize: 10 }}
    141. />
    142. )
    143. }
    144. export default SunDay