在不少列表展现数据的场合中,大多数都会须要一个排序的处理,以方便快速查找排序所需的数据,本篇随笔介绍如何结合ABP后端和Vue+Element前端结合的分页排序处理过程。前端
咱们首先参考一下Element界面组件的排序说明。以下效果是Element表格组件的排序效果。后端
在列中设置sortable
属性便可实现以该列为基准的排序,接受一个Boolean
,默认为false
。能够经过 Table 的default-sort
属性设置默认的排序列和排序顺序。可使用sort-method
或者sort-by
使用自定义的排序规则。若是须要后端排序,需将sortable
设置为custom
,同时在 Table 上监听sort-change
事件,在事件回调中能够获取当前排序的字段名和排序顺序,从而向接口请求排序后的表格数据。在本例中,咱们还使用了formatter
属性,它用于格式化指定列的值,接受一个Function
,会传入两个参数:row
和column
,能够根据本身的需求进行处理。框架
根据上面说明,咱们这里采起的是后端排序,将sortable
设置为custom。以下案例代码所示。
async
<!--表格列表信息 --> <el-table v-loading="listLoading" :data="list" border fit stripe highlight-current-row :header-cell-style="{background:'#eef1f6',color:'#606266'}" @selection-change="selectionChange" @row-dblclick="rowDbclick" @sort-change="sortChange" > <el-table-column type="selection" width="40" /> <el-table-column align="center" sortable="custom" prop="name" label="姓名"> <template slot-scope="scope"> {{ scope.row.name }} </template> </el-table-column> <el-table-column align="center" sortable="custom" prop="age" label="年龄"> <template slot-scope="scope"> {{ scope.row.age }} 岁 </template> </el-table-column> <!--日期字段信息,显示完整时间格式:formatter="timeFormat",不然使用:formatter="dateFormat" --> <el-table-column align="center" label="建立时间" sortable="custom" width="160" prop="creationTime" :formatter="timeFormat" />
以上是界面端的HTML代码,那么前端JS的处理逻辑也须要相应处理下,上面代码中 @sort-change="sortChange" 定义了排序变化的触发事件处理。ide
methods: { sortChange({ column, prop, order }) { var direction = (order === 'ascending') ? ' ASC' : ' DESC' this.sorting = !this.isEmpty(prop) ? (prop + direction) : null this.getlist() },
以上代码主要逻辑是构建一个排序字符串,如:字段 ASC 或 字段 DESC的字符串,以供ABP后端的排序处理便可,这个主要是根据ABP框架排序特色进行提交的。测试
咱们经过getlist的方法提交对应的查询条件和排序字符串,让后端再次获取数据给咱们前端处理。this
getlist() { // 列表数据获取 var param = { // 构造常规的分页查询条件 // 分页条件 SkipCount: (this.pageinfo.pageindex - 1) * this.pageinfo.pagesize, MaxResultCount: this.pageinfo.pagesize, Sorting: this.sorting, // 查询过滤条件 Name: this.searchForm.name, AgeStart: this.searchForm.ageStart }; // 使用日期范围选择控件,在查询对象增长开始日期CreationTimeStart、结束日期CreationTimeEnd this.addDateRange(param, this.searchForm.creationTime) // 获取列表,绑定到模型上,并修改分页数量 this.listLoading = true customer.GetAll(param).then(data => { this.list = data.result.items this.pageinfo.total = data.result.totalCount this.listLoading = false }) },
那么剩下的时候,就是后端如何处理数据的问题了。spa
咱们查看ABP的应用服务层的接口基类能够看到,对应的获取全部记录GetAll方法的定义以下所示。code
public virtual async Task<PagedResultDto<TEntityDto>> GetAllAsync(TGetAllInput input) { CheckGetAllPermission(); //检查权限 var query = CreateFilteredQuery(input); //构建查询条件 var totalCount = await AsyncQueryableExecuter.CountAsync(query); //获取记录总数 query = ApplySorting(query, input); //排序 query = ApplyPaging(query, input); //分页 var entities = await AsyncQueryableExecuter.ToListAsync(query); //返回实体记录 return new PagedResultDto<TEntityDto>( //构建分页展现数据 totalCount, entities.Select(MapToEntityDto).ToList() //实体转换DTO ); }
通常状况下,这些逻辑咱们通常不会变化,咱们只须要进行必定的重写构建查询条件,以及排序规则便可。orm
例如重写条件查询获取查询对象的处理以下。
详细代码以下所示:
/// <summary> /// 自定义条件处理 /// </summary> /// <param name="input">查询条件Dto</param> /// <returns></returns> protected override IQueryable<Customer> CreateFilteredQuery(CustomerPagedDto input) { return base.CreateFilteredQuery(input) .WhereIf(!input.ExcludeId.IsNullOrWhiteSpace(), t=>t.Id != input.ExcludeId) //不包含排除ID .WhereIf(!input.Name.IsNullOrWhiteSpace(), t => t.Name.Contains(input.Name)) //如须要精确匹配则用Equals //年龄区间查询 .WhereIf(input.AgeStart.HasValue, s => s.Age >= input.AgeStart.Value) .WhereIf(input.AgeEnd.HasValue, s => s.Age <= input.AgeEnd.Value) //建立日期区间查询 .WhereIf(input.CreationTimeStart.HasValue, s => s.CreationTime >= input.CreationTimeStart.Value) .WhereIf(input.CreationTimeEnd.HasValue, s => s.CreationTime <= input.CreationTimeEnd.Value) ; }
排序的处理,咱们能够重写下规则以下所示。
/// <summary> /// 自定义排序处理 /// </summary> /// <param name="query">可查询LINQ</param> /// <param name="input">查询条件Dto</param> /// <returns></returns> protected override IQueryable<Customer> ApplySorting(IQueryable<Customer> query, CustomerPagedDto input) { if (!string.IsNullOrEmpty(input.Sorting))//排序字段是否有值 { query = query.OrderBy(input.Sorting); } else { query = query.OrderByDescending(t => t.CreationTime); } return query; }
完成这些,咱们就能够测试前端的界面效果了。