feat: 封装table hooks

master
LCJ-MinYa 12 months ago
parent 7391ec2d5c
commit 18fa67952a

@ -0,0 +1,117 @@
import { ref, onMounted } from 'vue';
import { ElMessageBox } from 'element-plus';
/**
* @FileDescription: el-table 函数式组件hooks--实现一个表格的数据加载分页搜索删除等操作,
* @function:useTable(config)
* @param {object} config useTable(配置项)
* @param {function} config.requestDataFN 分页列表接口函数
* @param {object} config.seracgForm 搜索表单配置
* @param {function} config.deleteItemFN 删除某一项接口函数
*
* @param {object} config.pagination 分页配置对象
* @param {string} config.pagination.currentPage 当前页数
* @param {string} config.pagination.pageSize 每页显示条数
* @param {string} config.pagination.total 总条数
* @param {string} config.pagination.pageSizes 每页显示条数选项[10, 20, 30, 40, 50]
* @param {string} config.pagination.layout 布局方式'total, sizes, prev, pager, next, jumper'
* @param {string} config.pagination.background 页码背景色true/false
* ...其他参考element-plus分页组件参数
*
* @param {object} config.options 其他配置项
* @param {boolean} config.options.immediate 是否默认执行
*
* @returns {boolean} lodding 表格加载状态包含请求数据删除数据等
* @returns {array} tableData 表格数据
* @returns {object} pagination 表格分页数据
* @returns {function} handleRequestDataFN 请求数据函数
* @returns {function} handleSearchFN 搜索函数
* @returns {function} handlePaginationChangeFN 页码或者每页显示条数变化函数
* @returns {function} handleDeleteItemFN 删除函数
* */
export default function useTable(config) {
const {
seracgForm,
requestDataFN,
deleteItemFN,
options = {
immediate: true,
},
} = config;
const tableData = ref([]);
const lodding = ref(false);
const defaultPagination = {
currentPage: 1,
pageSize: 10,
total: 0,
pageSizes: [10, 20, 30, 40, 50],
layout: 'total, sizes, prev, pager, next, jumper',
background: true,
};
const pagination = ref(...defaultPagination, ...(config.pagination || {}));
// 请求表格数据
const handleRequestDataFN = () => {
if (lodding.value || !requestDataFN) return;
lodding.value = true;
requestDataFN({
...seracgForm,
pageNumber: pagination.value.currentPage,
psgeSize: pagination.value.pageSize,
})
.then((result) => {
tableData.value = result.list;
pagination.value.total = result.totalCount;
})
.finally(() => {
lodding.value = false;
});
};
// 点击搜索按钮请求表格数据
const handleSearchFN = () => {
pagination.value.currentPage = 1;
handleRequestDataFN();
};
// 页码或者每页显示条数变化请求表格数据
const handlePaginationChangeFN = (currentPage, pageSize) => {
pagination.value.currentPage = currentPage;
pagination.value.pageSize = pageSize;
handleRequestDataFN();
};
// 删除某一项
const handleDeleteItemFN = (item) => {
ElMessageBox.confirm('确认删除该项吗?')
.then(() => {
lodding.value = true;
deleteItemFN(item.id)
.then(() => {
tableData.value = tableData.value.filter((i) => i.id !== item.id);
pagination.value.total--;
})
.finally(() => {
lodding.value = false;
});
})
.catch(() => {});
};
onMounted(() => {
if (options?.immediate === undefined || options.immediate === true) {
handleRequestDataFN();
}
});
return {
lodding,
tableData,
pagination,
handleRequestDataFN,
handleSearchFN,
handlePaginationChangeFN,
handleDeleteItemFN,
};
}
Loading…
Cancel
Save