UX 缺陷修复: - 校验失败不再卡死弹窗按钮(Users/Roles/Bills) - 押金收取/批量收取/添加分期防重复提交;切换房型重置勾选 - AI 表单/批量确认不再出现"假成功" - Dashboard 各数据模块独立加载,单接口失败不再整页清零 - 房间可视化加载失败显示错误态而非永久转圈 - 学生编辑表单回填前重置,避免字段残留污染 - 覆盖式导入增加二次确认;恢复默认考勤时段确认并同步表单 - 金数据匹配关闭前确认,同步中禁止误关 体验提升: - 新增统一 QueryErrorState/QueryEmpty,20+ 页面加载失败显示错误态与重试 - 全局 ErrorBoundary + RouteKeeper 逐页兜底 - 新增 usePageVisible/useVisibleRefetch,保活页面切回自动刷新数据 - 新增首次登录角色引导 RoleTour 与业务闭环 NextStepHint 引导卡 - 重构 A2UI:useSubmissionState/useXCardSurface 收敛状态与命令生命周期, ArtifactErrorBoundary 渲染降级,图表空数据占位 - AI 助手欢迎语与建议话术按角色定制,会话列表空态引导 - 更新 a2ui-contract.md 契约文档说明实现现状
53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import React from 'react';
|
|
import { Button, Result } from 'antd';
|
|
|
|
interface AppErrorBoundaryProps {
|
|
children: React.ReactNode;
|
|
/** 自定义降级内容;不传则使用默认错误卡片 */
|
|
fallback?: React.ReactNode;
|
|
}
|
|
|
|
interface AppErrorBoundaryState {
|
|
hasError: boolean;
|
|
}
|
|
|
|
/**
|
|
* 全局渲染错误兜底:捕获子树内的渲染异常,展示可恢复的错误卡片,
|
|
* 避免单个页面/组件崩溃导致整个应用白屏。
|
|
*/
|
|
export class AppErrorBoundary extends React.Component<
|
|
AppErrorBoundaryProps,
|
|
AppErrorBoundaryState
|
|
> {
|
|
state: AppErrorBoundaryState = { hasError: false };
|
|
|
|
static getDerivedStateFromError(): AppErrorBoundaryState {
|
|
return { hasError: true };
|
|
}
|
|
|
|
componentDidCatch(error: Error, info: React.ErrorInfo): void {
|
|
console.error('[AppErrorBoundary] 渲染异常:', error, info.componentStack);
|
|
}
|
|
|
|
render(): React.ReactNode {
|
|
if (this.state.hasError) {
|
|
if (this.props.fallback) return this.props.fallback;
|
|
return (
|
|
<Result
|
|
status="error"
|
|
title="页面出现异常"
|
|
subTitle="请刷新页面重试;若问题持续,请联系管理员。"
|
|
extra={
|
|
<Button type="primary" onClick={() => window.location.reload()}>
|
|
刷新页面
|
|
</Button>
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
return this.props.children;
|
|
}
|
|
}
|
|
|
|
export default AppErrorBoundary;
|