Table.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <div class="page_table">
  3. <!-- :height="tableHeight" -->
  4. <el-table
  5. :data="props.tableData" stripe v-loading="props.loading" element-loading-text="拼命加载中……"
  6. element-loading-spinner="el-icon-loading" element-loading-background="#ffffff"
  7. element-loading-custom-class="loading_icon"
  8. :row-class-name="props.tableRowClassName"
  9. @row-click="(row,column)=> emit('rowClick',row)"
  10. :span-method="props.spanMethod">
  11. <!-- show-overflow-tooltip -->
  12. <template
  13. v-for="(item,index) in props.tableColumns"
  14. :key="item.name"
  15. >
  16. <el-table-column
  17. v-if="!item.hidden"
  18. :prop="item.name"
  19. :min-width="item.width"
  20. :label="item.label"
  21. :fixed="item.fixed ? item.fixed : false"
  22. :align="item.align" >
  23. <template v-if="item.customHeader" #header>
  24. <slot :name="'header-'+item.name"></slot>
  25. </template>
  26. <template v-if="item.custom" #default="row">
  27. <slot :name="item.name" :row="row.row" :currentIndex="(row.$index + 1)">
  28. </slot>
  29. </template>
  30. </el-table-column>
  31. </template>
  32. </el-table>
  33. <div class="page_pagination" v-if="!(hidePagination)">
  34. <!-- background layout="sizes, prev, pager, next" -->
  35. <el-pagination
  36. :hide-on-single-page="props.hidesinglePage"
  37. :current-page="props.currentPage"
  38. :page-size="props.pageSize"
  39. :page-sizes="[20, 50, 100]"
  40. background layout="prev, pager, next"
  41. :total="Number(props.totalNum)"
  42. @current-change="(val)=>emit('paginationChange',{type:'currentPage',val})"
  43. @size-change="(val)=>emit('paginationChange',{type:'pageSize',val})" />
  44. </div>
  45. </div>
  46. </template>
  47. <script setup lang="ts">
  48. interface ColumnProperty {
  49. name:String,
  50. label:String,
  51. width?:String,
  52. fixed?:String,
  53. align?:String,
  54. minWdth?:String,
  55. custom:String,
  56. customHeader?:Boolean,
  57. hidden:Boolean,
  58. }
  59. const props = defineProps({
  60. tableData:{
  61. required:true,
  62. type:Array
  63. },
  64. tableColumns:{
  65. required:true,
  66. type:Array<ColumnProperty>
  67. },
  68. currentPage:{
  69. required:true,
  70. type:Number
  71. },
  72. pageSize:{
  73. required:true,
  74. type:Number
  75. },
  76. totalNum:{
  77. required:true,
  78. type:Number
  79. },
  80. loading:{
  81. type:Boolean,
  82. default:false
  83. },
  84. hidesinglePage:{
  85. type:Boolean,
  86. },
  87. hidePagination:{
  88. type:Boolean,
  89. default:false
  90. },
  91. spanMethod:{
  92. type:Function,
  93. required:false
  94. },
  95. tableRowClassName:{
  96. type:Function,
  97. required:false
  98. }
  99. })
  100. const emit = defineEmits(['paginationChange','rowClick'])
  101. /*
  102. //demo
  103. const HandleSpanMethod = ({row,column,rowIndex,columnIndex}) => {
  104. if(['type'].includes(column.property)){
  105. return {
  106. rowspan: row.sameRow,
  107. colspan: 1,
  108. }
  109. }
  110. }
  111. const HandleTableRowClassName = ({row,rowIndex}) => {
  112. if(row.parentIndex % 2 == 0){
  113. // 偶数行
  114. return 'even_row'
  115. }else{
  116. // 奇数行
  117. return 'odd_row'
  118. }
  119. }
  120. */
  121. </script>
  122. <style lang="scss" scoped>
  123. .page_table{
  124. overflow: auto;
  125. display: flex;
  126. flex-direction: column;
  127. justify-content: flex-start;
  128. .el-table{
  129. flex-grow: 1;
  130. :deep(.el-scrollbar__view){
  131. height: 100%;
  132. }
  133. }
  134. :deep(.el-table__body){
  135. tbody tr.even_row td{
  136. background-color: white;
  137. }
  138. tbody tr.odd_row td{
  139. background-color: rgb(250, 250, 250);
  140. }
  141. // .hover-fixed-row
  142. tbody tr.hover-row td{
  143. background-color: rgb(245,247,250);
  144. }
  145. tbody tr td:last-child:not([rowspan="1"]){
  146. border-left:solid rgba(235,238,245) 1px;
  147. }
  148. }
  149. }
  150. :deep(.loading_icon){
  151. .el-loading-spinner{
  152. .el-loading-text{
  153. color:#2e64fa;
  154. }
  155. }
  156. }
  157. </style>