XcTable.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <el-table
  3. ref="tableRef"
  4. :data="!props.localPaging ? props.data.data :
  5. props.data.data.slice((props.data.currentPage - 1) * props.data.pageSize,props.data.currentPage * props.data.pageSize) "
  6. style="width: 100%"
  7. :height="!props.height ? windowSize.h - 100 :props.height"
  8. @selection-change="selectionChange"
  9. @row-click="rowClick"
  10. highlight-current-row
  11. :row-key="props.rowKey"
  12. border
  13. @select-all="selectAll"
  14. default-expand-all
  15. stripe>
  16. <slot/>
  17. </el-table>
  18. <el-pagination
  19. :current-page="props.data.currentPage"
  20. :page-size="props.data.pageSize"
  21. :total="props.data.total"
  22. :layout="props.layout"
  23. :small="!!props.small"
  24. :page-sizes="props.pageSizes"
  25. @current-change="currentChange"
  26. @size-change="sizeChange"/>
  27. </template>
  28. <script setup name='XcTable'>
  29. import store from "@/store";
  30. import {ElMessage} from "element-plus";
  31. const props = defineProps({
  32. data: {
  33. type: Object,
  34. default: {
  35. data: [],
  36. currentPage: 1,
  37. pageSize: 30,
  38. total: 0
  39. },
  40. },
  41. rowKey: {
  42. type: String
  43. },
  44. height: {
  45. type: Number,
  46. },
  47. localPaging: {
  48. type: Boolean,
  49. },
  50. openPaging: {
  51. type: Boolean,
  52. default: true
  53. },
  54. layout: {
  55. type: String,
  56. default: 'total, sizes, prev, pager, next, jumper'
  57. },
  58. small: {
  59. type: Boolean
  60. },
  61. pageSizes: {
  62. type: Array,
  63. default: [10, 20, 30, 100]
  64. },
  65. })
  66. const emit = defineEmits([
  67. 'currentChange',
  68. 'sizeChange',
  69. 'rowClick',
  70. 'selectionChange'
  71. ])
  72. let tableRef = $ref(null)
  73. const windowSize = computed(() => {
  74. return store.state.app.windowSize
  75. })
  76. let flag = false // 默认 为全不选
  77. const selectAll = (selection) => {
  78. flag = !flag
  79. if (!flag) {
  80. // 在点击了全不选中 需要清空
  81. tableRef.clearSelection()
  82. return
  83. }
  84. let length = selection.length
  85. for (let i = 0; i < length; i++) {
  86. let item = selection[i]
  87. if (item.children) {
  88. toggleSelection(item.children, flag)
  89. }
  90. }
  91. }
  92. const toggleSelection = (row, selected) => {
  93. if (row) {
  94. for (let i = 0, len = row.length; i < len; i++) {
  95. tableRef.toggleRowSelection(row[i], selected)
  96. }
  97. }
  98. }
  99. const selectionChange = (selection) => {
  100. emit('selectionChange', selection)
  101. }
  102. const rowClick = (row, column, event) => {
  103. let data = tableRef.getSelectionRows()
  104. if (row.children) {
  105. for (let i = 0, len = row.children.length; i < len; i++) {
  106. tableRef.toggleRowSelection(row.children[i], !data.includes(row))
  107. }
  108. }
  109. tableRef.toggleRowSelection(row, !data.includes(row))
  110. emit('rowClick', row, column, event);
  111. }
  112. const currentChange = (val) => {
  113. props.data.currentPage = val
  114. emit('currentChange', props.data)
  115. tableRef.setScrollTop(0)
  116. }
  117. const sizeChange = (val) => {
  118. props.data.pageSize = val
  119. props.data.currentPage = 1
  120. emit('sizeChange', props.data)
  121. tableRef.setScrollTop(0)
  122. }
  123. const clearSelection = () => {
  124. tableRef.clearSelection()
  125. ElMessage.success('清空成功。')
  126. }
  127. /**
  128. * 查询条件赋值
  129. */
  130. const queryConditionAssignment = () => {
  131. }
  132. defineExpose({clearSelection})
  133. </script>
  134. <style scoped>
  135. </style>