index.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <div>
  3. <el-alert
  4. effect="dark"
  5. :closable="false"
  6. title="基于 Element 的 Table 组件进行二次封装,实现数据驱动,支持所有 Table 参数 -- 筛选"
  7. type="info"
  8. style="margin-bottom: 20px;"
  9. />
  10. <el-button @click="resetDateFilter">清除日期过滤器</el-button>
  11. <el-button @click="clearFilter">清除所有过滤器</el-button>
  12. <com-table
  13. ref="filterTable"
  14. v-loading="loading"
  15. row-key="date"
  16. :columns="columns"
  17. :data="tableData"
  18. :default-sort="{prop: 'date', order: 'descending'}"
  19. >
  20. <template #tag="scope">
  21. <el-tag
  22. :type="scope.row.tag === '家' ? 'primary' : 'success'"
  23. disable-transitions
  24. >{{ scope.row.tag }}</el-tag>
  25. </template>
  26. </com-table>
  27. </div>
  28. </template>
  29. <script lang="ts">
  30. import { defineComponent, ref, unref } from 'vue'
  31. const tableData = [
  32. {
  33. date: '2016-05-02',
  34. name: '王小虎',
  35. address: '上海市普陀区金沙江路 1518 弄',
  36. tag: '家'
  37. }, {
  38. date: '2016-05-04',
  39. name: '王小虎',
  40. address: '上海市普陀区金沙江路 1517 弄',
  41. tag: '公司'
  42. }, {
  43. date: '2016-05-01',
  44. name: '王小虎',
  45. address: '上海市普陀区金沙江路 1519 弄',
  46. tag: '家'
  47. }, {
  48. date: '2016-05-03',
  49. name: '王小虎',
  50. address: '上海市普陀区金沙江路 1516 弄',
  51. tag: '公司'
  52. }
  53. ]
  54. export default defineComponent({
  55. // name: 'ScreenTable',
  56. setup() {
  57. const filterTable = ref<HTMLElement | null>(null)
  58. const loading = ref<boolean>(true)
  59. setTimeout(() => {
  60. loading.value = false
  61. }, 1000)
  62. const columns = ref<any[]>([
  63. {
  64. field: 'date',
  65. label: '日期',
  66. sortable: true,
  67. width: '180',
  68. columnKey: 'date',
  69. filters: [{ text: '2016-05-01', value: '2016-05-01' }, { text: '2016-05-02', value: '2016-05-02' }, { text: '2016-05-03', value: '2016-05-03' }, { text: '2016-05-04', value: '2016-05-04' }],
  70. filterMethod: filterHandler
  71. },
  72. {
  73. field: 'name',
  74. label: '姓名',
  75. sortable: true
  76. },
  77. {
  78. field: 'address',
  79. label: '地址'
  80. },
  81. {
  82. field: 'tag',
  83. label: '标签',
  84. filters: [{ text: '家', value: '家' }, { text: '公司', value: '公司' }],
  85. filterMethod: filterTag,
  86. filterPlacement: 'bottom-end',
  87. slots: {
  88. default: 'tag'
  89. }
  90. }
  91. ])
  92. function resetDateFilter() {
  93. const filterTableRef = unref(filterTable as any).getTableRef()
  94. filterTableRef.clearFilter('date')
  95. }
  96. function clearFilter() {
  97. const filterTableRef = unref(filterTable as any).getTableRef()
  98. filterTableRef.clearFilter()
  99. }
  100. function filterTag(value: string, row: any) {
  101. return row.tag === value
  102. }
  103. function filterHandler(value: string, row: any, column: any) {
  104. const property = column['property']
  105. return row[property] === value
  106. }
  107. return {
  108. columns,
  109. tableData,
  110. loading,
  111. filterTable,
  112. resetDateFilter, clearFilter, filterTag, filterHandler
  113. }
  114. }
  115. })
  116. </script>
  117. <style>
  118. </style>