review:主子表的示例代码

pull/76/head
YunaiV 2025-04-19 11:57:38 +08:00
parent 7622e9a666
commit 4ccda9a5a1
9 changed files with 29 additions and 28 deletions

View File

@ -10,6 +10,7 @@ export namespace Demo03StudentApi {
name?: string; // 名字
score?: number; // 分数
}
// TODO @puhui999要不要每个 interface 之间,有个空行
/** 学生班级信息 */
export interface Demo03Grade {
id: number; // 编号
@ -60,6 +61,7 @@ export function exportDemo03Student(params: any) {
}
// ==================== 子表(学生课程) ====================
// TODO @puhui999==================== 后面,加个空行,会更清晰一点
/** 获得学生课程列表 */
export function getDemo03CourseListByStudentId(studentId: number) {
return requestClient.get<Demo03StudentApi.Demo03Course[]>(

View File

@ -67,6 +67,7 @@ function onActionClick({ code, row }: OnActionClickParams<Demo01ContactApi.Demo0
onDelete(row);
break;
}
// TODO @puhui999edit delete =>
case 'edit': {
onEdit(row);
break;

View File

@ -57,7 +57,7 @@ const [Modal, modalApi] = useVbenModal({
}
if (data.id) {
//
// TODO @puhui99912data.id
modalApi.lock();
try {
data = await getDemo01Contact(data.id);

View File

@ -180,7 +180,7 @@ export function useGridColumns(
}
// ==================== 子表(学生课程) ====================
/** 新增/修改列表的字段 */
/** 新增/修改列表的字段 */ // TODO @puhui999 ==== 下面空一行;
export function useDemo03CourseGridEditColumns(
onActionClick?: OnActionClickFn<Demo03StudentApi.Demo03Course>,
): VxeTableGridOptions<Demo03StudentApi.Demo03Course>['columns'] {
@ -222,7 +222,7 @@ export function useDemo03CourseGridEditColumns(
},
];
}
/** 列表的字段 */
/** 列表的字段 */ // TODO @puhui999这里空一行
export function useDemo03CourseGridColumns(): VxeTableGridOptions<Demo03StudentApi.Demo03Course>['columns'] {
return [
{
@ -253,7 +253,7 @@ export function useDemo03CourseGridColumns(): VxeTableGridOptions<Demo03StudentA
},
];
}
// ==================== 子表(学生班级) ====================
// ==================== 子表(学生班级) ==================== // TODO @puhui999 ==== 前后都空一行;
/** 新增/修改的表单 */
export function useDemo03GradeFormSchema(): VbenFormSchema[] {
return [

View File

@ -119,6 +119,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
<Grid table-title="">
<template #expand_content="{ row }">
<!-- 子表的表单 -->
<!-- TODO @puhui999样式优化1Tabs 和箭头对齐2 Table 也和箭头对齐 -->
<Tabs v-model:active-key="subTabsName">
<Tabs.TabPane key="demo03Course" tab="学生课程" force-render>
<Demo03CourseList :student-id="row?.id" />

View File

@ -1,4 +1,5 @@
<script lang="ts" setup>
// TODO @puhui999使 + 线
import type { OnActionClickParams } from '#/adapter/vxe-table';
import type { Demo03StudentApi } from '#/api/infra/demo/demo03/inner';
@ -13,7 +14,7 @@ import { h, nextTick, watch } from 'vue';
import { useDemo03CourseGridEditColumns } from '../data';
const props = defineProps<{
studentId?: any; //
studentId?: any; // TODO @puhui999 number
}>();
/** 表格操作按钮的回调函数 */
@ -26,6 +27,7 @@ function onActionClick({ code, row }: OnActionClickParams<Demo03StudentApi.Demo0
}
}
// TODO @puhui999 GridgridApi
const [Demo03CourseGrid, demo03CourseGridApi] = useVbenVxeGrid({
gridOptions: {
columns: useDemo03CourseGridEditColumns(onActionClick),
@ -51,6 +53,7 @@ const onDelete = async (row: Demo03StudentApi.Demo03Course) => {
};
/** 添加学生课程 */
// TODO @puhui999 onAdd add delete
const handleAdd = async () => {
await demo03CourseGridApi.grid.insertAt({} as Demo03StudentApi.Demo03Course, -1);
};
@ -58,21 +61,13 @@ const handleAdd = async () => {
/** 提供获取表格数据的方法供父组件调用 */
defineExpose({
getData: (): Demo03StudentApi.Demo03Course[] => {
//
const allData = demo03CourseGridApi.grid.getData();
const removedData = demo03CourseGridApi.grid.getRemoveRecords();
const removedIds = new Set(removedData.map((row) => row.id));
//
const currentData = allData.filter((row) => !removedIds.has(row.id));
// id
const insertedData = demo03CourseGridApi.grid.getInsertRecords().map((row) => {
delete row.id;
return row;
});
return [...currentData, ...insertedData];
// TODO @puhui999
const data = demo03CourseGridApi.grid.getData() as Demo03StudentApi.Demo03Course[];
const removeRecords = demo03CourseGridApi.grid.getRemoveRecords() as Demo03StudentApi.Demo03Course[];
const insertRecords = demo03CourseGridApi.grid.getInsertRecords() as Demo03StudentApi.Demo03Course[];
return data
.filter(row => !removeRecords.some(removed => removed.id === row.id))
.concat(insertRecords.map(row => ({ ...row, id: undefined })));
},
});
@ -84,7 +79,7 @@ watch(
return;
}
await nextTick();
await nextTick(); // TODO @puhui999
await demo03CourseGridApi.grid.loadData(await getDemo03CourseListByStudentId(props.studentId!));
},
);
@ -99,7 +94,8 @@ watch(
<Input v-model:value="row.score" />
</template>
</Demo03CourseGrid>
<div class="flex justify-center">
<!-- TODO @puhui999-mt-4 把距离控制下哈 -->
<div class="flex justify-center -mt-4">
<Button :icon="h(Plus)" type="primary" ghost @click="handleAdd" v-access:code="['infra:demo03-student:create']">
{{ $t('ui.actionTitle.create', ['学生课程']) }}
</Button>

View File

@ -9,7 +9,7 @@ import { nextTick, watch } from 'vue';
import { useDemo03CourseGridColumns } from '../data';
const props = defineProps<{
studentId?: any; //
studentId?: any; // TODO @puhui999 number
}>();
const [Grid, gridApi] = useVbenVxeGrid({
@ -42,7 +42,7 @@ watch(
return;
}
await nextTick();
await nextTick(); // TODO @puhui999
await onRefresh();
},
{ immediate: true },
@ -50,6 +50,7 @@ watch(
</script>
<template>
<!-- TODO @puhui999这个边距可以调整下还是箭头那相关的哈 -->
<div class="mx-4">
<Grid table-title="" />
</div>

View File

@ -6,7 +6,7 @@ import { nextTick, watch } from 'vue';
import { useDemo03GradeFormSchema } from '../data';
const props = defineProps<{
studentId?: any; //
studentId?: any; // TODO @puhui999 number
}>();
const [Demo03GradeForm, demo03GradeFormApi] = useVbenForm({
@ -32,7 +32,7 @@ watch(
return;
}
await nextTick();
await nextTick(); // TODO @puhui999
await demo03GradeFormApi.setValues(await getDemo03GradeByStudentId(props.studentId!));
},
);

View File

@ -9,7 +9,7 @@ import { nextTick, watch } from 'vue';
import { useDemo03GradeGridColumns } from '../data';
const props = defineProps<{
studentId?: any; //
studentId?: any; // // TODO @puhui999
}>();
const [Grid, gridApi] = useVbenVxeGrid({
@ -42,7 +42,7 @@ watch(
return;
}
await nextTick();
await nextTick(); // TODO @puhui999
await onRefresh();
},
{ immediate: true },