index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <div class="system-table-box">
  3. <el-table v-bind="$attrs" ref="table" class="system-table" border :height="height" :data="data"
  4. @selection-change="handleSelectionChange">
  5. <el-table-column type="selection" align="center" width="50" v-if="showSelection" />
  6. <el-table-column label="序号" width="60" align="center" v-if="showIndex">
  7. <template #default="scope">
  8. {{ (page.pageNum - 1) * page.pageSize + scope.$index + 1 }}
  9. </template>
  10. </el-table-column>
  11. <slot></slot>
  12. </el-table>
  13. <el-pagination v-if="showPage" v-model:current-page="page.pageNum" class="system-page" background :layout="pageLayout"
  14. :total="page.total" :page-size="page.pageSize" :page-sizes="pageSizes" @current-change="handleCurrentChange"
  15. @size-change="handleSizeChange">
  16. </el-pagination>
  17. </div>
  18. </template>
  19. <script lang="js">
  20. import { defineComponent, ref, onActivated } from 'vue'
  21. export default defineComponent({
  22. props: {
  23. data: { type: Array, default: () => [] }, // 数据源
  24. select: { type: Array, default: () => [] }, // 已选择的数据,与selection结合使用
  25. showIndex: { type: Boolean, default: false }, // 是否展示index选择,默认否
  26. showSelection: { type: Boolean, default: false }, // 是否展示选择框,默认否
  27. showPage: { type: Boolean, default: true }, // 是否展示页级组件,默认是
  28. page: { // 分页参数
  29. type: Object,
  30. default: () => {
  31. return { pageNum: 1, pageSize: 20, total: 0 }
  32. }
  33. },
  34. pageLayout: { type: String, default: "total, sizes, prev, pager, next, jumper" }, // 分页需要显示的东西,默认全部
  35. pageSizes: { type: Array, default: [10, 20, 50, 100] },
  36. id: { type: String, default: '' }, // 行数据的 Key,用来优化 Table 的渲染;
  37. height: { type: String, default: '100%' },
  38. },
  39. setup(props, context) {
  40. const table = ref(null)
  41. let timer = null
  42. // 分页相关:监听页码切换事件
  43. const handleCurrentChange = (val) => {
  44. if (timer) {
  45. props.page.pageNum = 1
  46. } else {
  47. props.page.pageNum = val
  48. context.emit("getTableData")
  49. }
  50. }
  51. // 分页相关:监听单页显示数量切换事件
  52. const handleSizeChange = (val) => {
  53. timer = 'work'
  54. setTimeout(() => {
  55. timer = null
  56. }, 100)
  57. props.page.pageSize = val
  58. context.emit("getTableData", true)
  59. }
  60. // 选择监听器
  61. const handleSelectionChange = (val) => {
  62. context.emit("selection-change", val)
  63. }
  64. // 解决BUG:keep-alive组件使用时,表格浮层高度不对的问题
  65. onActivated(() => {
  66. table.value.doLayout()
  67. })
  68. return {
  69. table,
  70. handleCurrentChange,
  71. handleSizeChange,
  72. handleSelectionChange
  73. }
  74. }
  75. })
  76. </script>
  77. <style lang="scss" scoped>
  78. .system-table-box {
  79. display: flex;
  80. flex-direction: column;
  81. justify-content: center;
  82. align-items: flex-start;
  83. height: 100%;
  84. .system-table {
  85. flex: 1;
  86. height: 100%;
  87. }
  88. .system-page {
  89. margin-top: 20px;
  90. &::before {
  91. content: '';
  92. }
  93. }
  94. }
  95. :deep() {
  96. .el-table {
  97. color: var(--system-page-color);
  98. --el-table-tr-bg-color: var(--system-page-background);
  99. --el-table-bg-color: var(--system-page-background);
  100. --el-table-header-bg-color: var(--system-page-background);
  101. --el-table-border-color: var(--system-page-border-color);
  102. --el-table-row-hover-bg-color: var(--system-container-background);
  103. --el-bg-color: var(--system-page-background) !important; //左边固定栏背景色
  104. }
  105. // 分页器
  106. .el-input__wrapper,
  107. .btn-prev,
  108. .btn-next,
  109. .number {
  110. background-color: var(--system-page-background) !important;
  111. color: var(--system-page-color);
  112. border-color: var(--system-page-border-color);
  113. }
  114. .is-active {
  115. color: var(--system-primary-text-color);
  116. background-color: var(--system-primary-color) !important;
  117. }
  118. }
  119. </style>