index.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import {
  2. TableColumnProps, Table, Row, Col, Space, Tooltip, Dropdown, Menu,
  3. Button, DropdownButton, PaginationProps
  4. } from 'ant-design-vue'
  5. import { DownOutlined } from '@ant-design/icons-vue'
  6. import { PropType, computed, defineComponent, reactive, ref, defineEmits, FunctionalComponent } from 'vue'
  7. /**
  8. * @description Table Pro 超级table 将各种业务与操作融合起来
  9. */
  10. interface GenericListProps<T> {
  11. dataSource: T;
  12. }
  13. interface Props {
  14. columns: TableColumnProps[],
  15. pagination: PaginationProps | false
  16. request: {
  17. get: (record: any) => {data, sum},
  18. params: any
  19. }
  20. }
  21. const TablePro: FunctionalComponent<Props> = (props) => {
  22. const { request } = props
  23. console.log('defineComponent:', props)
  24. const columns = [{ title: '', key: 'ky' }]
  25. const emits = defineEmits(['add'])
  26. const loading = ref<boolean>(false)
  27. const columnsPro = ref<(TableColumnProps & {hidden: boolean}) []>(columns.map(column => ({ ...column, hidden: false })))
  28. const columnsFilter = computed(() => columnsPro.value.filter(column => !column.hidden))
  29. const rowCustomized = computed(() => columns.map(item => ({ title: item.title, key: item.key })))
  30. const pagination = reactive<PaginationProps>(Object.assign({}, {
  31. current: 1,
  32. pageSize: 10,
  33. total: 0,
  34. onChange: (page: number, pageSize: number) => onChangePage(page, pageSize)
  35. }, typeof props.pagination === 'boolean' ? {} : { ...props.pagination }))
  36. const dataSource = ref()
  37. const opraMeun = (
  38. <Menu>
  39. <Menu.item key={0} onClick={emits('add')} > 新增 </Menu.item>
  40. <Menu.item key={2} onClick={() => exportExcel()}> 导出 </Menu.item>
  41. <Menu.item key={3} onClick={() => pure()}> 纯净 </Menu.item>
  42. </Menu>
  43. )
  44. const exportExcel = () => {}
  45. const pure = () => {}
  46. const reload = () => dispatchRequest()
  47. const onChangePage = (page: number, pageSize: number) => {
  48. pagination.current = page
  49. pagination.pageSize = pageSize
  50. dispatchRequest()
  51. }
  52. const dispatchRequest = async () => {
  53. loading.value = true
  54. const { data, sum } = await request.get({
  55. ...request.params,
  56. page: pagination.current,
  57. pageSize: pagination.pageSize
  58. })
  59. loading.value = false
  60. pagination.total = sum
  61. dataSource.value = data
  62. }
  63. /**
  64. * 展示或者隐藏对应的column
  65. */
  66. const swicthColumn = (index: number) => {
  67. columnsPro.value[index].hidden = !columnsPro.value[index].hidden
  68. }
  69. return (
  70. <>
  71. <Row gutter={[8, 8]}>
  72. <Col span={12} >
  73. {/* <solt name="search" ></solt> */}
  74. </Col>
  75. <Col span={12} >
  76. <Space>
  77. <Tooltip title='列表定制' >
  78. {/* @click.prevent */}
  79. {/* <a class="ant-dropdown-link"> <menu-outlined /> </a> */}
  80. <Dropdown
  81. trigger={['click']}
  82. overlay={
  83. <Menu>
  84. {
  85. // rowCustomized.value.map((item, index) => (
  86. // <Menu.item key={item.key} onClick={() => swicthColumn(index)} >
  87. // {item.title}
  88. // </Menu.item>
  89. // ))
  90. }
  91. </Menu>}
  92. >
  93. </Dropdown>
  94. </Tooltip>
  95. {/* @click.prevent */}
  96. {/* <a class="ant-dropdown-link"> <menu-outlined /> </a> */}
  97. <DropdownButton
  98. trigger={['click']}
  99. overlay={opraMeun}
  100. icon={<DownOutlined />}
  101. onClick={reload}
  102. >
  103. <Button>刷新</Button>
  104. </DropdownButton>
  105. </Space>
  106. </Col>
  107. </Row>
  108. {/* dataSource={dataSource} */}
  109. {/* <Table
  110. columns={columnsFilter.value}
  111. loading={loading.value}
  112. pagination={typeof props.pagination === 'boolean' ? false : pagination}
  113. >
  114. <slot></slot>
  115. <slot name='action'></slot>
  116. </Table> */}
  117. </>
  118. )
  119. }
  120. export default TablePro