Files
pqs-9100_client/frontend/src/hooks/useTable.ts

158 lines
4.1 KiB
TypeScript
Raw Normal View History

2024-08-22 11:27:06 +08:00
import { Table } from "./interface";
import { reactive, computed, toRefs } from "vue";
/**
* @description table
* @param {Function} api api ()
* @param {Object} initParam ({})
* @param {Boolean} isPageable (true)
* @param {Function} dataCallBack ()
* */
export const useTable = (
api?: (params: any) => Promise<any>,
initParam: object = {},
isPageable: boolean = true,
dataCallBack?: (data: any) => any,
requestError?: (error: any) => void
) => {
const state = reactive<Table.StateProps>({
// 表格数据
tableData: [],
// 分页数据
pageable: {
// 当前页数
2024-10-31 14:53:29 +08:00
current: 1,
2024-08-22 11:27:06 +08:00
// 每页显示条数
2024-10-31 14:53:29 +08:00
size: 10,
2024-08-22 11:27:06 +08:00
// 总条数
2024-10-10 17:47:55 +08:00
total: 0,
2024-08-22 11:27:06 +08:00
},
// 查询参数(只包括查询)
searchParam: {},
// 初始化默认的查询参数
searchInitParam: {},
// 总参数(包含分页和查询参数)
2024-10-10 17:47:55 +08:00
totalParam: {},
2024-08-22 11:27:06 +08:00
});
/**
* @description (,)
* */
const pageParam = computed({
get: () => {
return {
pageNum: state.pageable.pageNum,
2024-10-10 17:47:55 +08:00
pageSize: state.pageable.pageSize,
2024-08-22 11:27:06 +08:00
};
},
set: (newVal: any) => {
console.log("我是分页更新之后的值", newVal);
2024-10-10 17:47:55 +08:00
},
2024-08-22 11:27:06 +08:00
});
/**
* @description
* @return void
* */
const getTableList = async () => {
if (!api) return;
try {
// 先把初始化参数和分页参数放到总参数里面
2024-10-10 17:47:55 +08:00
Object.assign(
state.totalParam,
initParam,
isPageable ? pageParam.value : {}
);
let { data } = await api({
...state.searchInitParam,
...state.totalParam,
});
2024-08-22 11:27:06 +08:00
dataCallBack && (data = dataCallBack(data));
2024-10-31 14:53:29 +08:00
state.tableData = isPageable ? data.records : data;
2024-08-22 11:27:06 +08:00
// 解构后台返回的分页数据 (如果有分页更新分页信息)
if (isPageable) {
2024-08-26 20:05:04 +08:00
state.pageable.total = data.total;
2024-10-31 14:53:29 +08:00
state.pageable.current = data.current;
state.pageable.size = data.size;
2024-08-22 11:27:06 +08:00
}
} catch (error) {
requestError && requestError(error);
}
};
/**
* @description
* @return void
* */
const updatedTotalParam = () => {
state.totalParam = {};
// 处理查询参数,可以给查询参数加自定义前缀操作
let nowSearchParam: Table.StateProps["searchParam"] = {};
// 防止手动清空输入框携带参数(这里可以自定义查询参数前缀)
for (let key in state.searchParam) {
// 某些情况下参数为 false/0 也应该携带参数
2024-10-10 17:47:55 +08:00
if (
state.searchParam[key] ||
state.searchParam[key] === false ||
state.searchParam[key] === 0
) {
2024-08-22 11:27:06 +08:00
nowSearchParam[key] = state.searchParam[key];
}
}
2024-08-26 20:05:04 +08:00
Object.assign(state.totalParam, nowSearchParam);
2024-08-22 11:27:06 +08:00
};
/**
* @description
* @return void
* */
const search = () => {
state.pageable.pageNum = 1;
updatedTotalParam();
getTableList();
};
/**
* @description
* @return void
* */
const reset = () => {
state.pageable.pageNum = 1;
// 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数
state.searchParam = { ...state.searchInitParam };
updatedTotalParam();
getTableList();
};
/**
* @description
* @param {Number} val
* @return void
* */
const handleSizeChange = (val: number) => {
state.pageable.pageNum = 1;
state.pageable.pageSize = val;
getTableList();
};
/**
* @description
* @param {Number} val
* @return void
* */
const handleCurrentChange = (val: number) => {
state.pageable.pageNum = val;
getTableList();
};
return {
...toRefs(state),
getTableList,
search,
reset,
handleSizeChange,
handleCurrentChange,
2024-10-10 17:47:55 +08:00
updatedTotalParam,
2024-08-22 11:27:06 +08:00
};
};