feat: 封装table hooks,table示例页面

master
LCJ-MinYa 12 months ago
parent 18fa67952a
commit 338d6dab44

@ -32,10 +32,11 @@ export function getPluginsList(VITE_CDN: boolean, VITE_COMPRESSION: ViteCompress
removeNoMatch(), removeNoMatch(),
// mock支持 // mock支持
vitePluginFakeServer({ vitePluginFakeServer({
logger: false, logger: true,
include: 'mock', include: 'mock',
infixName: false, infixName: false,
enableProd: true, enableProd: true,
timeout: 500,
}), }),
// 自定义主题 // 自定义主题
themePreprocessorPlugin({ themePreprocessorPlugin({

@ -0,0 +1,34 @@
// 根据角色动态生成路由
import { defineFakeRoute } from 'vite-plugin-fake-server/client';
import { faker } from '@faker-js/faker';
export default defineFakeRoute([
{
url: '/table/list',
method: 'post',
response: ({ body }) => {
const list = [];
for (let i = 0; i < body.psgeSize; i++) {
list.push({
id: faker.string.uuid(),
avatar: faker.image.avatar(),
birthday: faker.date.birthdate(),
email: faker.internet.email(),
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
sex: faker.person.sexType(),
});
}
return {
success: true,
code: 200,
data: {
list,
total: 77,
pageSize: body.pageSize,
pageNumber: body.pageNumber,
},
};
},
},
]);

@ -0,0 +1,10 @@
import { http } from '@/utils/http';
type Result = {
success: boolean;
data: Array<any>;
};
export const getTableList = (params) => {
return http.post<Result>('/table/list', { data: params });
};

@ -6,7 +6,16 @@
<style lang="scss"> <style lang="scss">
.base-footer { .base-footer {
display: flex;
margin-top: 10px; margin-top: 10px;
& > .el-card {
display: flex;
align-items: center;
justify-content: flex-end;
& > .el-card__body {
padding: 10px;
}
}
} }
</style> </style>

@ -6,7 +6,12 @@
<style lang="scss"> <style lang="scss">
.base-header { .base-header {
display: flex;
margin-bottom: 10px; margin-bottom: 10px;
& > .el-card {
& > .el-card__body {
padding: 10px;
}
}
} }
</style> </style>

@ -1,12 +1,13 @@
import { ref, onMounted } from 'vue'; import { ref, onMounted, nextTick } from 'vue';
import { ElMessageBox } from 'element-plus'; import { ElMessageBox } from 'element-plus';
import { message } from '@/utils/message';
/** /**
* @FileDescription: el-table hooks--, * @FileDescription: el-table hooks--,
* @function:useTable(config) * @function:useTable(config)
* @param {object} config useTable() * @param {object} config useTable()
* @param {function} config.requestDataFN * @param {function} config.requestDataFN
* @param {object} config.seracgForm * @param {object} config.searchForm
* @param {function} config.deleteItemFN * @param {function} config.deleteItemFN
* *
* @param {object} config.pagination * @param {object} config.pagination
@ -29,9 +30,9 @@ import { ElMessageBox } from 'element-plus';
* @returns {function} handlePaginationChangeFN * @returns {function} handlePaginationChangeFN
* @returns {function} handleDeleteItemFN * @returns {function} handleDeleteItemFN
* */ * */
export default function useTable(config) { export function useTable(config) {
const { const {
seracgForm, searchForm,
requestDataFN, requestDataFN,
deleteItemFN, deleteItemFN,
options = { options = {
@ -40,7 +41,7 @@ export default function useTable(config) {
} = config; } = config;
const tableData = ref([]); const tableData = ref([]);
const lodding = ref(false); const loading = ref(false);
const defaultPagination = { const defaultPagination = {
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
@ -49,23 +50,24 @@ export default function useTable(config) {
layout: 'total, sizes, prev, pager, next, jumper', layout: 'total, sizes, prev, pager, next, jumper',
background: true, background: true,
}; };
const pagination = ref(...defaultPagination, ...(config.pagination || {})); const pagination = ref({ ...defaultPagination, ...(config.pagination || {}) });
// 请求表格数据 // 请求表格数据
const handleRequestDataFN = () => { const handleRequestDataFN = () => {
if (lodding.value || !requestDataFN) return; if (loading.value || !requestDataFN) return;
lodding.value = true; loading.value = true;
requestDataFN({ requestDataFN({
...seracgForm, ...searchForm,
pageNumber: pagination.value.currentPage, pageNumber: pagination.value.currentPage,
psgeSize: pagination.value.pageSize, psgeSize: pagination.value.pageSize,
}) })
.then((result) => { .then((result) => {
tableData.value = result.list; const { list, total } = result.data;
pagination.value.total = result.totalCount; tableData.value = list;
pagination.value.total = total;
}) })
.finally(() => { .finally(() => {
lodding.value = false; loading.value = false;
}); });
}; };
@ -83,17 +85,26 @@ export default function useTable(config) {
}; };
// 删除某一项 // 删除某一项
const handleDeleteItemFN = (item) => { const handleDeleteItemFN = (params, callback) => {
ElMessageBox.confirm('确认删除该项吗?') if (loading.value || !deleteItemFN) return;
ElMessageBox.confirm('您确认要确认删除选中的数据吗?', '删除数据')
.then(() => { .then(() => {
lodding.value = true; loading.value = true;
deleteItemFN(item.id) deleteItemFN(params)
.then(() => { .then(() => {
tableData.value = tableData.value.filter((i) => i.id !== item.id); if (callback) {
pagination.value.total--; callback();
} else {
message('删除数据成功', { type: 'success' });
/* 使nextTickloadingtrue
* handleRequestDataFNloadingtrue,
* finallythen
*/
nextTick(() => handleRequestDataFN());
}
}) })
.finally(() => { .finally(() => {
lodding.value = false; loading.value = false;
}); });
}) })
.catch(() => {}); .catch(() => {});
@ -106,7 +117,7 @@ export default function useTable(config) {
}); });
return { return {
lodding, loading,
tableData, tableData,
pagination, pagination,
handleRequestDataFN, handleRequestDataFN,

@ -1,231 +1,134 @@
<template> <template>
<base-container> <base-container>
<base-header> <base-header>
<el-card style="width: 100%"> 我是header </el-card> <el-card>
<el-form
:model="form"
:inline="true"
>
<el-form-item label="姓名">
<el-input
v-model="form.firstName"
placeholder="请输入姓名"
></el-input>
</el-form-item>
<el-form-item label="名称">
<el-input
v-model="form.lastName"
placeholder="请输入名称"
></el-input>
</el-form-item>
<el-form-item label="生日">
<el-input
v-model="form.birthday"
placeholder="请输入生日"
></el-input>
</el-form-item>
<el-form-item label="邮箱">
<el-input
v-model="form.email"
placeholder="请输入邮箱"
></el-input>
</el-form-item>
<el-form-item
label="性别"
praceholder="请选择性别"
style="width: 150px"
>
<el-select v-model="form.sex">
<el-option
label="男"
value="male"
></el-option>
<el-option
label="女"
value="female"
></el-option>
</el-select>
</el-form-item>
</el-form>
<el-row justify="end">
<el-button
type="primary"
@click="handleSearchFN"
>查询</el-button
>
<el-button
type="primary"
class="mr-5"
>新增</el-button
>
</el-row>
</el-card>
</base-header> </base-header>
<pure-table <pure-table
border
class="base-main" class="base-main"
:data="tableData" :data="tableData"
:columns="columns" :columns="columns"
size="large" size="large"
v-loading="loading"
/> />
<base-footer> <base-footer>
<el-card style="width: 100%"> 我是footer </el-card> <el-card>
<el-pagination
v-model:current-page="pagination.currentPage"
v-model:page-size="pagination.pageSize"
v-bind="pagination"
@change="handlePaginationChangeFN"
/>
</el-card>
</base-footer> </base-footer>
</base-container> </base-container>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import { ref } from 'vue'; import { ref } from 'vue';
import { useTable } from '@/hooks/useTable';
import { getTableList } from '@/api/table';
defineOptions({ defineOptions({
name: 'TemplateLayout', name: 'TemplateLayout',
}); });
const form = ref({
firstName: '',
lastName: '',
birthday: '',
email: '',
sex: '',
});
const tableData = ref([ const columns = [
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{
name: 'Bob',
age: 28,
},
{
name: 'John',
age: 25,
},
{
name: 'Jane',
age: 30,
},
{ {
name: 'Bob', label: '序号',
age: 28, type: 'index',
width: 70,
}, },
{ {
name: 'John', label: '姓名',
age: 25, prop: 'firstName',
}, },
{ {
name: 'Jane', label: '名称',
age: 30, prop: 'lastName',
}, },
{ {
name: 'Bob', label: '生日',
age: 28, prop: 'birthday',
}, },
]);
const columns = [
{ {
label: '姓名', label: '邮箱',
prop: 'name', prop: 'email',
}, },
{ {
label: '年龄', label: '性别',
prop: 'age', prop: 'sex',
}, },
]; ];
const { loading, tableData, pagination, handleRequestDataFN, handleSearchFN, handlePaginationChangeFN, handleDeleteItemFN } = useTable({
searchForm: form.value,
requestDataFN: getTableList,
});
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

Loading…
Cancel
Save