解决el-table排序sortable只排序当前页问题

el-table-column数据全量排序解决方案

el-table-column中添加sortable只是让每页数据单独排序,没有把所有数据进行排序,可以通过sort-change事件解决。

1、首先在需要排序的列上加sortable=“custom”

 <el-table-column
        prop="date"
        label="日期"
        width="180"
        sortable="custom">
 </el-table-column>

2、在el-table中加@sort-change=“sortChange”

 <el-table
      :data="tableData"
      style="width: 100%"
      @sort-change="sortChange">

3、最后添加排序方法sortChange,其中column.prop是属性名,column.order是排序方式

sortChange(column){ 
        var type="";
        for(var i=0;i<this.tableData.length;i++){
          if(this.tableData[i][column.prop]!=null&&this.tableData[i][column.prop]!=undefined&&this.tableData[i][column.prop]!=''){
            type=typeof(this.tableData[i][column.prop]);
            break;
          }
        }
        if(this.tableData.length>0&&type!=""){
          if(column.order=="ascending"){
            this.tableData=this.tableData.sort((a,b)=>{
              if(a[column.prop]==undefined||a[column.prop]==null){
                a[column.prop]='';
              } 
              if(b[column.prop]==undefined||b[column.prop]==null){
                b[column.prop]='';
              }
              if(type=="number"){
                return a[column.prop]-b[column.prop]
              }else{
                return a[column.prop].localeCompare(b[column.prop])
              }
              })
          }else if(column.order=="descending"){
            this.tableData=this.tableData.sort((a,b)=>{
              if(a[column.prop]==undefined||a[column.prop]==null){
                a[column.prop]='';
              } 
              if(b[column.prop]==undefined||b[column.prop]==null){
                b[column.prop]='';
              }
              if(type=="number"){
                return b[column.prop]-a[column.prop]
              }else{
                return b[column.prop].localeCompare(a[column.prop])
              }               
            })
          }
        }
      },
### 如何在 `el-table` 中实现后端排序 #### 后端排序的概念 后端排序是指通过向服务器发送请求来获取按照指定字段和顺序排列的数据。前端仅负责展示数据,而实际的排序逻辑由后端完成。 --- #### 接口配置说明 为了支持后端排序,在调用 API 获取数据时,通常需要传递两个参数: 1. **sortField**: 要排序的字段名。 2. **orderType**: 排序方式(升序或降序),一般为 `"asc"` 或 `"desc"`。 API 请求示例可以通过 Axios 发送如下 POST 数据结构[^1]: ```json { "page": 1, "pageSize": 10, "sortField": "name", "orderType": "asc" } ``` --- #### Vue 组件中的实现方法 以下是基于 Element UI 的 `el-table` 实现后端排序的一个完整示例: ```vue <template> <div> <el-table :data="tableData" @sort-change="handleSortChange"> <!-- 定义列 --> <el-table-column prop="id" label="ID" sortable></el-table-column> <el-table-column prop="name" label="名称" sortable></el-table-column> <el-table-column prop="age" label="年龄" sortable></el-table-column> </el-table> <el-pagination background layout="prev, pager, next" :total="totalCount" @current-change="fetchData"></el-table-column> </div> </template> <script> import axios from 'axios'; export default { data() { return { tableData: [], // 表格数据 totalCount: 0, // 总记录数 sortField: '', // 当前排序字段 orderType: '' // 当前排序方向 (asc|desc) }; }, methods: { fetchData(page = 1) { const params = { page, pageSize: 10, sortField: this.sortField || null, orderType: this.orderType || null }; axios.post('/api/data', params).then(response => { this.tableData = response.data.list; this.totalCount = response.data.total; }); }, handleSortChange({ column, prop, order }) { if (!prop) { this.sortField = ''; this.orderType = ''; } else { this.sortField = prop; // 设置当前排序字段 this.orderType = order === 'ascending' ? 'asc' : 'desc'; // 设置排序方向 } this.fetchData(1); // 刷新第一页数据 } }, created() { this.fetchData(); // 初始化加载数据 } }; </script> ``` --- #### 关键点解析 1. **sortable 属性** 在 `<el-table-column>` 标签中设置 `sortable=true` 可启用该列的排序功能[^3]。 2. **@sort-change 事件监听器** 使用 `@sort-change` 方法捕获用户的排序操作,并动态更新组件内的排序状态变量 `sortField` 和 `orderType`[^4]。 3. **分页与排序结合** 每次触发排序或切换页面时重新发起网络请求,确保显示最新的排序结果。 --- #### 注意事项 - 如果某些列不支持排序,则无需为其添加 `sortable` 属性。 - 需要确保后端接口能够接收并处理 `sortField` 和 `orderType` 参数。 - 对于大型数据集,建议优先采用后端分页和排序以减少内存占用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值