fix(admin): 补全 React hooks 依赖并修复页面稳定性

- 各页面 useCallback/useMemo 依赖补全(modal/mutation/setter 等),避免闭包过期
- ECharts 使用 optionRef、MainLayout 缓存菜单转换函数、main.tsx 增加挂载点校验
- 学生同步结果改用 recordsCount 展示
This commit is contained in:
2026-08-05 21:14:08 +08:00
parent ab4765cee5
commit 1a1e90c72f
21 changed files with 439 additions and 341 deletions

View File

@@ -92,12 +92,15 @@ const RolesPage: React.FC = () => {
setModalOpen(true);
};
const handleEdit = (record: RoleItem) => {
setEditing(record);
form.setFieldsValue({ name: record.name, description: record.description });
setSelectedPermIds(record.permissions.map((p) => p.id));
setModalOpen(true);
};
const handleEdit = useCallback(
(record: RoleItem) => {
setEditing(record);
form.setFieldsValue({ name: record.name, description: record.description });
setSelectedPermIds(record.permissions.map((p) => p.id));
setModalOpen(true);
},
[form],
);
const handleSubmit = async () => {
setSaving(true);
@@ -117,14 +120,17 @@ const RolesPage: React.FC = () => {
}
};
const handleDisable = async (id: number) => {
try {
await disableMutation.mutateAsync(id);
message.success('角色已停用');
} catch {
// 错误提示由 useApiMutation 统一处理
}
};
const handleDisable = useCallback(
async (id: number) => {
try {
await disableMutation.mutateAsync(id);
message.success('角色已停用');
} catch {
// 错误提示由 useApiMutation 统一处理
}
},
[disableMutation],
);
const groupNames: Record<string, string> = {
dashboard: '数据面板',
@@ -264,7 +270,7 @@ const RolesPage: React.FC = () => {
),
},
],
[permissionOptions, saveCell],
[permissionOptions, saveCell, handleEdit, handleDisable],
);
const handleGroupCheckAll = (group: string, checked: boolean) => {