• element table表格实现多列排序并清除排序


    业务需求如下

    1.点击的单个进行排序时,要求isAsc对应当前字段的排序顺序;值ascending,descending,null三种情况;若指定了列对应的prop,没有指定order的话,默认ascending;

    2.多列同时排序的话,要求isAsc对应最后点击的字段对应的排序顺序;orderByColumn字段格式

    orderByColumn:'字段1+' '+字段1对应的排序顺序,字段2+' '+字段2对应的排序顺序,..最后点击的字段' 

    诟病:可能存在的情况,取消其中一个字段的排序时,无法定位isAsc对应的值;

    现实现的场景:isAsc,当取消某个字段的排序,默认定位到当前需要排序的数组中的最后一项对                        应的排序顺序;     

    3.多列排序后,点击刷新,调用官方提供的clearSort(),只能清除最后点击的字段对应的高亮;

    @sort-change事件:监听排序事件

    1. <el-table
    2. :data="tableData"
    3. border
    4. @sort-change="handleSortChange"
    5. :header-cell-class-name="handleHeaderCellClass"
    6. >
    7. <el-table-column
    8. label="云类型"
    9. align="center"
    10. prop="cloudType"
    11. sortable="custom"
    12. >
    13. <template slot-scope="{ row }">
    14. <span>{{ row.cloudType == 0 ? '专属云' : '合营云' }}</span>
    15. </template>
    16. </el-table-column>
    17. </el-table>

    注意:

    @sort-change 事件:表格的排序条件发生变化的时触发,参数 { column, prop, order }, 分别代表的意义是:

    column:当前列

    prop:当前列需要排序的数据

    order:排序的规则(升序、降序和默认[默认就是没排序])

    orderArray需要进行排序的列对应的字段和排序顺序

    1. //添加排序方法(可把多个字段共同加入排序)
    2. handleHeaderCellClass({ row, column, rowIndex, columnIndex }) {
    3. this.orderArray.forEach(element => {
    4. if (column.property === element.prop) {
    5. column.order = element.order
    6. }
    7. })
    8. },
    9. // 点击排序箭头
    10. handleSortChange({ column, prop, order }) {
    11. if (!order || this.sortField[prop] === order) {
    12. // 排序字段按触发顺序确定排列优先级,需要删除字段确保下次触发时位于最后优先级
    13. delete this.sortField[prop]
    14. } else {
    15. this.sortField[prop] = order
    16. }
    17. if (order) {
    18. //参与排序
    19. let flagIsHave = false
    20. this.orderArray.forEach(element => {
    21. if (element.prop === prop) {
    22. element.order = order
    23. flagIsHave = true
    24. }
    25. })
    26. if (!flagIsHave) {
    27. this.orderArray.push({
    28. prop: prop,
    29. order: order,
    30. })
    31. }
    32. this.curSort = order == 'descending' ? 'desc' : 'asc'
    33. } else {
    34. //不参与排序
    35. this.orderArray = this.orderArray.filter(element => {
    36. return element.prop !== prop
    37. })
    38. //取消当前的排序,curSort是当前点击项的前一项的order
    39. if (this.orderArray.length <= 0) {
    40. this.curSort = 'asc'
    41. } else {
    42. this.curSort =
    43. this.orderArray[this.orderArray.length - 1].order == 'descending'
    44. ? 'desc'
    45. : 'asc'
    46. // this.curSort =
    47. // this.orderArray[i - 1].order == 'descending' ? 'desc' : 'asc'
    48. console.log(this.curSort, 'ppp')
    49. }
    50. }
    51. //转换字段属性
    52. console.log(column, prop, order)
    53. this.getSortList(this.orderArray)
    54. },

    isAsc值的定位

    1. getSortList(arr) {
    2. let temArr = JSON.parse(JSON.stringify(arr))
    3. temArr.map(item => {
    4. item.prop = this.strChange(item.prop)
    5. item.order = item.order == 'descending' ? 'desc' : 'asc'
    6. return item
    7. })
    8. var str = ''
    9. for (var i = 0; i < temArr.length; i++) {
    10. str +=
    11. i === temArr.length - 1
    12. ? temArr[i].prop
    13. : temArr[i].prop + ' ' + temArr[i].order + ','
    14. }
    15. console.log(str)
    16. this.sortStr = str
    17. //调后端列表接口
    18. },

    将countType转换为count_type

    1. strChange(arg) {
    2. var str = arg.split('')
    3. for (var i = 0; i < str.length; i++) {
    4. if (str[i].charCodeAt() >= 65 && str[i].charCodeAt() <= 90) {
    5. str[i] = '_' + str[i].toLowerCase()
    6. }
    7. }
    8. return str.join('')
    9. },

    sortField对象,触发的排序和缓存的排序相同时,取消该字段的排序

    eg:{字段1:排序顺序,字段2:排序顺序...}

    1. flush() {
    2. this.orderArray = []
    3. this.curSort = 'asc'
    4. this.sortStr = ''
    5. // this.$refs.multipleTable.clearSort(),只会清除最后点击的一项的高亮
    6. //解决刷新,清除多列表头高亮
    7. Object.keys(this.sortField).forEach(prop => {
    8. this.$refs.multipleTable.sort(prop, null)
    9. })
    10. this.getList()
    11. },

  • 相关阅读:
    记录--Vue中前端导出word文件
    MySQL-索引
    测试用例的设计方法
    C#通过dll调用带参数的C++代码
    SpringBoot项目启动后访问网页显示“Please sign in“
    [动态规划]——线性DP(LIS/LCS/LCIS等) 详解
    千梦网创:创业一定要学会打造自己的榜样圈
    【C++ Primer Plus】第11章 使用类
    【1++的C++进阶】之智能指针
    【LeetCode】Day149-二叉搜索树转为累加树 & 最短无序连续子数组
  • 原文地址:https://blog.csdn.net/lf811/article/details/127802532