element ui - el-table数据排序

el-table 添加分页后对全部数据排序


场景

后台一次性返回全部数据,需要前端对所有数据进行分页和排序。

在这里插入图片描述


思路

使用element-ui的 自定义排序 规则,将 sortable 设置为 custom ,同时在 Table 上监听 sort-change 事件,在事件回调中可以获取当前排序的字段名和排序顺序,从而对所有数据进行排序再对表格数据进行分页计算。

代码

<el-table
        :data="currentPageData"
        :header-cell-style="{background:'#eef1f6',height: '48px'}"
        @sort-change="sortChange"
        border
        style="width: 100%;">
        
       /* 需要排序的列 */ 
      <el-table-column
          prop="report_type"
          label="取值"
          sortable="custom"
          width="200">
      </el-table-column>
	
	  /* 需要排序的列 */ 	
      <el-table-column
          prop="report_type_desc"
          label="中文映射"
          sortable="custom"
          width="200">
      </el-table-column>

      <el-table-column
          prop="remark"
          label="备注">
      </el-table-column>

      <el-table-column
          label="操作"
          width="250">
        <template slot-scope="scope">
          <el-button type="primary" size="mini" @click="edit(scope.row)">修改</el-button>
          <el-button type="success" size="mini" @click="copy(scope.row,scope.$index)">复制</el-button>
          <el-button type="danger" size="mini" @click="del(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
	// 排序
    sortChange({ prop, order }){
      this.allData.sort(this.compare(prop, order));
    },

	/**
     * 排序比较
     * @param {string} propertyName 排序的属性名
     * @param {string} sort ascending(升序)/descending(降序)
     * @return {function}
     */
    compare(propertyName, sort) {
    	// 判断是否为数字
        function isNumberV(val) {
            var regPos = /^\d+(\.\d+)?$/; //非负浮点数
            var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
            if (regPos.test(val) || regNeg.test(val)) {
                return true;
            } else {
                return false;
            }
        }
        
        return function (obj1, obj2) {
            let value1 = obj1[propertyName];
            let value2 = obj2[propertyName];
            // 数字类型的比较
            if(isNumberV(value1) || isNumberV(value2)){
                if (sort === "ascending") {
                    return value1 - value2;
                } else {
                    return value2 - value1;
                }
            }
            // 布尔值的比较:利用减法-转化true 和 false
            // true => 1   false ⇒ 0
            // true-false => 1  false-true => -1
            // 下面方法是按照先false后true的顺序排序,如果想先true后false,调整value1-value2 和  value2 - value1的顺序即可
            else if(_.isBoolean(value1) && _.isBoolean(value2)){
                if (sort === "ascending") {
                    return value1 - value2;
                } else {
                    return value2 - value1;
                }
            }
            // 字符比较使用localeCompare()
            else {
                const res = value1.localeCompare(value2, "zh");
                return sort === "ascending" ? res : -res;
            }
        };
    }

总结

如上封装的 compare 方法适合用于任何数据的排序。

Vue的el-table组件提供了数据排序的功能,可以通过设置column的sortable属性来开启排序功能。当用户点击表头时,会触发表格的排序事件,此时可以获取到当前排序的列和排序的方式(升序或降序),可以将这些信息发送给后台,后台再根据这些信息返回排序过后的数据。 具体实现可以参考以下步骤: 1. 在el-table-column中设置sortable属性为true,表示该列可以排序。 2. 监听el-table的sort-change事件,获取当前排序的列和排序的方式。 3. 将获取到的排序信息发送给后台,后台根据这些信息返回排序过后的数据。 4. 将返回的数据更新到el-table中,即可实现数据排序。 举个例子,假设我们有一个学生选课系统,使用Vue的el-table组件展示选课记录,我们可以按照选课时间、课程名称等字段进行排序。具体实现可以参考以下代码: ``` <template> <el-table :data="tableData" @sort-change="handleSortChange"> <el-table-column prop="courseName" label="课程名称" sortable></el-table-column> <el-table-column prop="selectTime" label="选课时间" sortable></el-table-column> <el-table-column prop="teacherName" label="授课教师"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [] } }, methods: { handleSortChange({ column, prop, order }) { // 发送排序信息给后台 this.$axios.post('/api/sort', { column, prop, order }).then(res => { // 更新表格数据 this.tableData = res.data }) } } } </script> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值