当前位置:   article > 正文

el-table 多列排序(仅前端)_el-table 列排序

el-table 列排序

有时候只需要完成对当前页数据的排序,其实完全不需要调用后端接口来排。

  1. <template>
  2. <div>
  3. <el-table
  4. :data="tempData"
  5. style="width: 100%"
  6. height="500"
  7. stripe
  8. :header-cell-class-name="handleHeaderClass"
  9. @header-click="handleHeaderClick"
  10. @sort-change="handleTableSort"
  11. >
  12. <el-table-column v-for="item in columnList" :key="item.id"
  13. :prop="item.prop"
  14. :label="item.label"
  15. :sortable="item.sortable"
  16. :width="item.width">
  17. </el-table-column>
  18. </el-table>
  19. </div>
  20. </template>
  21. <script>
  22. export default {
  23. data () {
  24. return {
  25. columnList: [
  26. { id: 1, prop: 'date', label: '日期', sortable: 'custom', width: '180' },
  27. { id: 2, prop: 'name', label: '姓名', sortable: 'custom', width: '180' },
  28. { id: 3, prop: 'age', label: '年龄', sortable: 'custom', width: '180' },
  29. { id: 4, prop: 'single', label: '单身', sortable: 'custom', width: '180' },
  30. { id: 5, prop: 'balance', label: '余额', sortable: 'custom' }
  31. ],
  32. tableData: [{
  33. date: '2023-05-01',
  34. name: 'xxx1',
  35. age: 26,
  36. single: '是',
  37. balance: 2000.1
  38. }, {
  39. date: '2023-05-01',
  40. name: 'xxx2',
  41. age: 18,
  42. single: '是',
  43. balance: 0
  44. }, {
  45. date: '2023-05-01',
  46. name: 'xxx3',
  47. age: 20,
  48. single: '否',
  49. balance: 1999
  50. }, {
  51. date: '2023-05-02',
  52. name: 'xxx4',
  53. age: 20,
  54. single: '否',
  55. balance: 2000
  56. }, {
  57. date: '2023-05-03',
  58. name: 'xxx4',
  59. age: 20,
  60. single: '是',
  61. balance: 2000.1
  62. }], // 原数据
  63. tempData: [], // 排序后的数据
  64. sortList: [] // 用于表格数据排序
  65. }
  66. },
  67. created () {
  68. this.tempData = Object.assign([], this.tableData)
  69. },
  70. methods: {
  71. // -----------------------------------------自定义函数-----------------------------------------------
  72. updateSortOrder (column) {
  73. // column.order 默认只能有一个不为 null,也就是说其它列的 order 改变时,原有的 order 会被置为 null
  74. // 所以用另一个字段 multiOrder 保存 order 状态
  75. column.multiOrder = column.order
  76. // 更新 sortList
  77. const index = this.sortList.findIndex(item => item.prop === column.property)
  78. if (index !== -1) {
  79. this.sortList.splice(index, 1)
  80. }
  81. if (column.order !== null) {
  82. this.sortList.push({ prop: column.property, order: column.order })
  83. }
  84. // sort
  85. this.sortTableData()
  86. },
  87. // 根据某一项比较
  88. compareData (prop, a, b, order) {
  89. const orderFactor = order === 'ascending' ? 1 : -1
  90. if (a[prop] < b[prop]) {
  91. return -1 * orderFactor
  92. }
  93. if (a[prop] > b[prop]) {
  94. return 1 * orderFactor
  95. }
  96. return 0
  97. },
  98. // 根据 sortList 对 data 进行排序
  99. sortTableData () {
  100. this.tempData = Object.assign([], this.tableData)
  101. this.tempData.sort((a, b) => {
  102. for (const item of this.sortList) {
  103. const tempResult = this.compareData(item.prop, a, b, item.order)
  104. if (tempResult) {
  105. return tempResult
  106. }
  107. }
  108. return 0
  109. })
  110. },
  111. // -----------------------------------------el-table 事件-----------------------------------------------
  112. // 点击表头
  113. // bug: 监听不到点击箭头
  114. handleHeaderClick (column) {
  115. // this.updateSortOrder(column)
  116. },
  117. // 点击箭头
  118. handleTableSort ({ column }) {
  119. this.updateSortOrder(column)
  120. },
  121. // 把 multiOrder 同步给 order
  122. handleHeaderClass ({ column }) {
  123. column.order = column.multiOrder
  124. }
  125. }
  126. }
  127. </script>
  128. <style scoped>
  129. </style>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/118002
推荐阅读
相关标签
  

闽ICP备14008679号