element-plus 前端表格分页
实现思路:
1.定义三个变量
tableData:存储所有表格数据
transferData:存储筛选操作之后的数据
tableShowData:存储当前页需要展示的数据
2.获取每页数据(transferData=>tableShowData)
for (
let i = (currentPage4.value - 1) * pageSize4.value;
i < currentPage4.value * pageSize4.value;
i++
) {
if (transferData.value[i]) {
tableShowData.value.push(transferData.value[i]);
}
}
const tableShowData = computed({
get() {
return transferData.value.slice(
(currentPage4.value - 1) * pageSize4.value,
currentPage4.value * ppageSize4.value
);
},
set(value) {},
});
3.添加表格可能用到的筛选,排序,多选等功能。
1.筛选:添加@filter-change="handleFilterChange"方法。
handleFilterChange(filter);
const fliterHandLerData: any = ref([]);//保存筛选后的数据
let emitObj: any = {};//保存筛选条件
emitObj = _.cloneDeep(filter);//获取筛选条件(filter函数参数)
if (emitObj[Object.keys(emitObj)[0]].length > 0) {//判断是否需要进行筛选
for (let item in emitObj) {//循环筛选条件
tableData.value.forEach((oitem) => {//循环原始数据每条数据
if (emitObj[item].includes(oitem[item])) {//判断指定字段这时候符合条件
fliterHandLerData.value.push(oitem);//附和则保存该条数据
}
});
}
transferData.value = fliterHandLerData.value;//将所有符合条件的数据存放到筛选后的变量中
} else {//没有筛选或者点击重置的时候直接赋值筛选变量所有数据
transferData.value = tableData.value;
}
2.排序 @sort-change="sortChange"
sortChange = ({ column, prop, order }) =>{}
if (order == "ascending") {
//升序
transferData.value.sort((a: any, b: any) => {
return a[prop] - b[prop];
});
} else if (order == "descending") {
//降序
transferData.value.sort((a: any, b: any) => {
return b[prop] - a[prop];
});
}
3.全选通过toggleRowSelection,toggleAllSelection,clearSelection完成全选,清楚全选,选中某条数据操作。
4.完整代码示例
<template>
<el-input v-model="search" @blur="inputBlur"></el-input>
<el-table
:data="tableShowData"
border
style="width: 100%"
@sort-change="sortChange"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="date" label="Date" width="180" sortable="custom" />
<el-table-column
prop="name"
label="Name"
width="180"
:filters="filters"
:filter-method="filterHandler"
/>
<el-table-column prop="address" label="Address" sortable="custom" />
</el-table>
<el-pagination
v-model:current-page="currentPage4"
v-model:page-size="pageSize4"
:page-sizes="[5, 10, 15, 20]"
:small="small"
:disabled="disabled"
:background="background"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</template>
<script lang="ts" setup>
import { ref } from "vue";
// 保存所有数据
const tableData = [
{
date: "1",
name: "Tom",
address: "2021-10-12",
},
{
date: "2",
name: "Tom",
address: "2021-10-15",
},
{
date: "4",
name: "Tom",
address: "2021-10-14",
},
{
date: "3",
name: "Tom",
address: "2021-10-10",
},
{
date: "5",
name: "Tom",
address: "2021-10-1",
},
{
date: "9",
name: "cad",
address: "2021-10-1",
},
{
date: "7",
name: "Tom",
address: "2021-10-1",
},
{
date: "6",
name: "Tom",
address: "2021-10-1",
},
{
date: "10",
name: "Tom",
address: "2021-10-1",
},
{
date: "8",
name: "Tom",
address: "2021-10-1",
},
{
date: "14",
name: "cad",
address: "2021-10-1",
},
{
date: "11",
name: "Tom",
address: "2021-10-1",
},
{
date: "15",
name: "Tom",
address: "2021-10-1",
},
{
date: "12",
name: "Tom",
address: "2021-10-1",
},
{
date: "17",
name: "Tom",
address: "2021-10-1",
},
{
date: "21",
name: "Tom",
address: "2021-10-1",
},
{
date: "16",
name: "cad",
address: "2021-10-1",
},
{
date: "13",
name: "Tom",
address: "2021-10-1",
},
{
date: "20",
name: "cad",
address: "2021-10-1",
},
{
date: "19",
name: "Tom",
address: "2021-10-1",
},
{
date: "18",
name: "Tom",
address: "2021-11-12",
},
{
date: "24",
name: "Tom",
address: "2021-11-12",
},
{
date: "23",
name: "cad",
address: "2021-11-12",
},
{
date: "22",
name: "cad",
address: "2021-11-12",
},
{
date: "28",
name: "cad",
address: "2021-11-12",
},
{
date: "27",
name: "Tom",
address: "2021-11-12",
},
{
date: "26",
name: "cad",
address: "2021-11-12",
},
{
date: "25",
name: "cad",
address: "2021-11-12",
},
{
date: "32",
name: "Tom",
address: "2021-11-12",
},
{
date: "31",
name: "kmi",
address: "2021-11-12",
},
{
date: "30",
name: "Tom",
address: "2021-11-12",
},
{
date: "34",
name: "kmi",
address: "2021-11-12",
},
{
date: "33",
name: "kmi",
address: "2021-11-12",
},
{
date: "29",
name: "Tom",
address: "2021-11-12",
},
{
date: "35",
name: "Tom",
address: "2021-11-12",
},
{
date: "36",
name: "kmi",
address: "2021-11-12",
},
{
date: "37",
name: "Tom",
address: "2021-11-12",
},
{
date: "38",
name: "Tom",
address: "2021-11-12",
},
{
date: "39",
name: "kmi",
address: "2021-11-12",
},
{
date: "40",
name: "Tom",
address: "2021-11-12",
},
{
date: "41",
name: "Bob",
address: "2021-11-12",
},
{
date: "42",
name: "Tom",
address: "2021-11-12",
},
{
date: "43",
name: "Tom",
address: "2021-11-12",
},
{
date: "44",
name: "Tom",
address: "2021-11-12",
},
{
date: "45",
name: "Tom",
address: "2021-11-12",
},
{
date: "46",
name: "Bob",
address: "2021-11-12",
},
{
date: "47",
name: "Tom",
address: "2021-11-12",
},
{
date: "48",
name: "Tom",
address: "2021-11-12",
},
{
date: "49",
name: "Bob",
address: "2021-11-12",
},
{
date: "50",
name: "Tom",
address: "2021-11-12",
},
{
date: "51",
name: "Bob",
address: "2021-11-12",
},
{
date: "52",
name: "Tom",
address: "2021-11-12",
},
];
// 保存中间处理后的数据
const transferData: any = ref([]);
// 保存需要展示的单页数据
const tableShowData: any = ref([]);
const currentPage4 = ref(1); //页数
const pageSize4 = ref(5); //每页数据条数
const small = ref(false);
const background = ref(false);
const disabled = ref(false);
const search = ref(null);
const total = ref(tableData.length);
const handleSizeChange = (val: number) => {
getData();
};
const getData = () => {
tableShowData.value = [];
for (
let i = (currentPage4.value - 1) * pageSize4.value;
i < currentPage4.value * pageSize4.value;
i++
) {
if (transferData.value[i]) {
tableShowData.value.push(transferData.value[i]);
}
}
};
const sortChange = ({ column, prop, order }) => {
getData();
if (order == "ascending") {
//升序
tableShowData.value.sort((a: any, b: any) => {
return a[prop] - b[prop];
});
} else if (order == "descending") {
//降序
tableShowData.value.sort((a: any, b: any) => {
return b[prop] - a[prop];
});
}
};
const inputBlur = () => {
transferData.value = [];
if (!search.value) {
transferData.value = tableData;
total.value = transferData.value.length;
return;
}
tableData.forEach((item) => {
if (item.name == search.value) {
transferData.value.push(item);
}
});
total.value = transferData.value.length;
getData();
};
const handleCurrentChange = (val: number) => {
getData();
};
const handleSelectionChange = (val: any) => {
console.log("多选val", val);
};
const filters = ref([
{
text: "Tom",
value: "Tom",
},
{
text: "cad",
value: "cad",
},
{
text: "kmi",
value: "kmi",
},
{
text: "Bob",
value: "Bob",
},
]);
// 组件提供筛选方式,只筛选当前展示数据中是否具有满足条件的数据
const filterHandler = (value: string, row: any, column: any) => {
const property = column["property"];
return row[property] === value;
};
onMounted(() => {
transferData.value = tableData;
for (
let i = (currentPage4.value - 1) * pageSize4.value;
i < currentPage4.value * pageSize4.value;
i++
) {
tableShowData.value.push(transferData.value[i]);
}
});
</script>
<style scoped lang="less">
.box {
width: 300px;
}
.pieChart {
width: 400px;
height: 400px;
}
</style>