filter.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <el-button @click="resetDateFilter">reset date filter</el-button>
  3. <el-button @click="clearFilter">reset all filters</el-button>
  4. <el-table ref="tableRef" row-key="date" :data="tableData" style="width: 100%">
  5. <el-table-column
  6. prop="date"
  7. label="Date"
  8. sortable
  9. width="180"
  10. column-key="date"
  11. :filters="[
  12. { text: '2016-05-01', value: '2016-05-01' },
  13. { text: '2016-05-02', value: '2016-05-02' },
  14. { text: '2016-05-03', value: '2016-05-03' },
  15. { text: '2016-05-04', value: '2016-05-04' },
  16. ]"
  17. :filter-method="filterHandler"
  18. />
  19. <el-table-column prop="name" label="Name" width="180" />
  20. <el-table-column prop="address" label="Address" :formatter="formatter" />
  21. <el-table-column
  22. prop="tag"
  23. label="Tag"
  24. width="100"
  25. :filters="[
  26. { text: 'Home', value: 'Home' },
  27. { text: 'Office', value: 'Office' },
  28. ]"
  29. :filter-method="filterTag"
  30. filter-placement="bottom-end"
  31. >
  32. <template #default="scope">
  33. <el-tag :type="scope.row.tag === 'Home' ? '' : 'success'" disable-transitions>{{ scope.row.tag }}</el-tag>
  34. </template>
  35. </el-table-column>
  36. </el-table>
  37. </template>
  38. <script lang="ts" setup>
  39. import { ref } from 'vue'
  40. import type { ElTable } from 'element-plus'
  41. import type { TableColumnCtx } from 'element-plus/es/components/table/src/table-column/defaults'
  42. interface User {
  43. date: string
  44. name: string
  45. address: string
  46. tag: string
  47. }
  48. const tableRef = ref<InstanceType<typeof ElTable>>()
  49. const resetDateFilter = () => {
  50. tableRef.value!.clearFilter(['date'])
  51. }
  52. // TODO: improvement typing when refactor table
  53. const clearFilter = () => {
  54. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  55. // @ts-expect-error
  56. tableRef.value!.clearFilter()
  57. }
  58. const formatter = (row: User, column: TableColumnCtx<User>) => {
  59. return row.address
  60. }
  61. const filterTag = (value: string, row: User) => {
  62. return row.tag === value
  63. }
  64. const filterHandler = (value: string, row: User, column: TableColumnCtx<User>) => {
  65. const property = column['property']
  66. return row[property] === value
  67. }
  68. const tableData: User[] = [
  69. {
  70. date: '2016-05-03',
  71. name: 'Tom',
  72. address: 'No. 189, Grove St, Los Angeles',
  73. tag: 'Home',
  74. },
  75. {
  76. date: '2016-05-02',
  77. name: 'Tom',
  78. address: 'No. 189, Grove St, Los Angeles',
  79. tag: 'Office',
  80. },
  81. {
  82. date: '2016-05-04',
  83. name: 'Tom',
  84. address: 'No. 189, Grove St, Los Angeles',
  85. tag: 'Home',
  86. },
  87. {
  88. date: '2016-05-01',
  89. name: 'Tom',
  90. address: 'No. 189, Grove St, Los Angeles',
  91. tag: 'Office',
  92. },
  93. ]
  94. </script>