@ovine/core
Version:
Build flexible admin system with json.
71 lines (70 loc) • 2.64 kB
JavaScript
/**
* 页面渲染错误处理
*/
// import { uuid } from 'amis/lib/utils/helper'
import React from 'react';
import { app } from "../../app";
import logger from "../../utils/logger";
import { StyledErrorPage } from "./styled";
const log = logger.getLogger('lib:components:ErrorBoundary');
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// log.error('getDerivedStateFromError:', error)
return { hasError: true, error };
}
componentDidCatch(error, errorInfo) {
log.error('componentDidCatch:', error, errorInfo);
}
// 每次更新清空错误状态
getSnapshotBeforeUpdate(_, prevState) {
if (prevState.hasError) {
this.setState({
hasError: false,
error: {},
});
}
return null;
}
// 页面内组件加载错误
renderCompError() {
return React.createElement("div", null, "\u7EC4\u4EF6\u9519\u8BEF");
}
// 页面加载错误
renderPageError() {
const { error } = this.state;
return (React.createElement(StyledErrorPage, null,
React.createElement("div", { className: "inner" },
React.createElement("div", { className: "error-img" }),
app.env.isRelease ? (React.createElement("span", null, "\u5F53\u524D\u9875\u9762\u53D1\u751F\u9519\u8BEF")) : (React.createElement("div", { className: "alert inline", role: "alert" },
React.createElement("h4", { className: "alert-heading" }, "\u5F53\u524D\u9875\u9762\u53D1\u751F\u9519\u8BEF"),
React.createElement("p", null, (error && error.message) || '未知渲染错误'),
React.createElement("hr", null),
React.createElement("p", null, "\u8BF7\u6253\u5F00console\u67E5\u770B"))))));
}
render() {
const { children, type = 'component' } = this.props;
const { hasError } = this.state;
if (hasError) {
switch (type) {
case 'page':
return this.renderPageError();
default:
return this.renderCompError();
}
}
return children;
}
}
// const ErrorBoundaryWrap = (props: Props) => {
// const { children, type } = props
// // hot热更新环境不处理 error提示
// if ((module as any).hot) {
// return children
// }
// return <ErrorBoundary type={type}>{children}</ErrorBoundary>
// }
export default ErrorBoundary;