antd vue table使用排序时,如何去掉默认不排序状态
ant-design-vue中的table组件具有排序的属性,该排序属性有三种状态:升序、降序和不排序。在项目开发中,有时产品经理会要求排序时只能有升序或降序两种状态,而table组件中却没有相应的API配置,那么我们如何取消不排序的状态呢?一、排序相关APItable组件中关于排序的API有4个:sorter、sortOrder、sortDirections以及change事件。sorter:排
ant-design-vue中的table组件具有排序的属性,该排序属性有三种状态:升序、降序和不排序。在项目开发中,有时产品经理会要求排序时只能有升序或降序两种状态,而table组件中却没有相应的API配置,那么我们如何取消不排序的状态呢?
一、排序相关API
table组件中关于排序的API有4个:sorter、sortOrder、sortDirections以及change事件。
sorter:排序函数,本地排序使用一个函数,需要服务端排序可设为 true。
sortOrder: 排序的受控属性,外界可用此控制列的排序,可设置为 ‘ascend’、‘descend’、‘false’。
sortDirections:sortDirections: [‘ascend’ | ‘descend’]改变每列可用的排序方式,切换排序时按数组内容依次切换,设置在table props上时对所有列生效。使用defaultSortOrder属性,设置列的默认排序顺序。
change:分页、排序、筛选变化时触发。
这三个API都需要设置在Column中,Column是列描述数据对象,是 columns 中的一项,Column 使用相同的 API。例如:
columns: [
{ title: "计划入库时间", dataIndex: "planPutStockTime", key: "planPutStockTime", width: 130 ,sortDirections: ['descend', 'ascend'],sorter:true},
{ title: "计划配货时间", dataIndex: "planPreGoodsTime", key: "planPreGoodsTime", width: 130 ,sortDirections: ['descend', 'ascend'],defaultSortOrder: 'descend',sorter:(a:any, b:any) => a.planPreGoodsTime.length - b.planPreGoodsTime.length},
],
上面的代码说明在table中有两列数据具有排序功能,排序功能由服务端提供,排序方式按照降序、升序的顺序依次切换。
除了上述3个属性之外,我们还需要在排序时触发chang事件。
<common-table :loading="loading" :dataSource="tableData" :columns="columns" :tableEditKey="tableEditKey" rowKey="index"
:pagination="pagination" :scroll="scroll" @handleChange="tableItemChange">
<template v-slot:action="slotProps">
<div class="table_action_box">
<a-button type="link" size="small" @click="queryClick(slotProps.record.record)"> 查看 </a-button>
</div>
</template>
</common-table>
tableItemChange(pagination, filters, sorter)有3个回调参数,其中跟排序相关的是sorter参数,它是一个对象,包含field、order属性,field描述当前排序的列,order描述当前排序的顺序。当处于不排序状态时,sorter对象为空
因此,我们可以通过判断当前sorter对象是否为空来判断当前的状态是否为不排序状态,并重新对其赋值并渲染,从而达到“消除”该状态的目的。
二、具体实现
根据上述的设置,目前的排序状态切换为:降序->升序->空->降序->升序->空…,为了将该顺序调整为:降序->升序->降序->升序…,首先,我们需要定义一个对象sortObj对象用于存储sorter对象的值。当sorter.order === 'descend’时,将此时的sorter赋值给sortObj,当判断出当前sorter.order为空时,即状态为不排序,将上一步存储降序状态的sortObj赋值给sorter,并重新渲染该列的排序样式,那么就能将不排序状态修改为降序状态。
const sortObj = reactive<any>({
sorter:{
columnKey: "planPreGoodsTime",
field: "planPreGoodsTime",
order: "descend"
}
})
const sortTrans = (sorter:any, index:number) => {
for (let i = 0; i < 5; i++) {
tableList.columns[i].sortOrder = false;
}
tableList.columns[index].sortOrder = sorter.order;
}
//分页
const tableItemChange = (item: any) => {
if (item.sorter.order === 'descend') {
sortObj.sorter = {
columnKey:item.sorter.columnKey,
field:item.sorter.field,
order:item.sorter.order,
}
}
if (!item.sorter.order) {
item.sorter = sortObj.sorter
}
switch (item.sorter.field) {
case 'planPutStockTime':
sortTrans(item.sorter, 3);
break;
case 'planPreGoodsTime':
sortTrans(item.sorter, 4);
break;
}
tableList.pagination.current = item.val.current
tableList.pagination.pageSize = item.val.pageSize
tableList.sorter.orderColumn = item.sorter.columnKey
tableList.sorter.orderType = item.sorter.order
getPageList()
}
渲染函数为sortTrans,它接收两个参数:sorter和index,index为当前列数据在columns数组中的位置。通过重新渲染当前列,并将其它排序列的sortOrder置为false,从而使每次切换排序时,都只有当前列处于排序状态。
三、总结
以上的思路可以总结为两步:
1、将值为空对象的sorter重新赋值为目标排序状态的sorter,该目标状态的sorter需要先存储下来;
2、重新赋值后,再重新渲染目标排序列的样式。
更多推荐
所有评论(0)