javascript - React 错误边界被调用但不渲染
问题描述
我创建了一个错误边界,将应用程序重定向到/error
路由。但是,有时当触发错误时(在代码框的情况下,通过单击错误页面的链接),我的错误边界被调用并且浏览器被重定向到/error
路由但应该显示的组件/error
不显示 /渲染,而我只看到一个白屏。出了什么问题,为什么会调用错误边界以重定向浏览器但渲染未完成?谢谢!
index.js:
import React from "react";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import { render } from "react-dom";
import ErrorBoundary from "./errorBoundary";
import "./index.css";
const App = () => (
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/bug">Page with Bug</Link>
</li>
</ul>
</nav>
<Switch>
<Route path="/bug">
<BugPage />
</Route>
<Route path="/error">
<ErrorPage />
</Route>
<Route path="/">
<HomePage />
</Route>
</Switch>
</div>
);
const HomePage = () => <h1>Home Page</h1>;
const ErrorPage = () => <h1>This is the error boundary</h1>;
const BugPage = () => {
const dummyData = {
foo: {
id: 1
}
};
return <h1>{dummyData.bar.id}</h1>;
};
const Spa = () => (
<Router>
<ErrorBoundary>
<App />
</ErrorBoundary>
</Router>
);
render(<Spa />, document.getElementById("root"));
错误边界.js:
import * as React from "react";
import { withRouter } from "react-router-dom";
export class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false,
hasRedirected: false
};
}
componentDidCatch(error) {
this.setState({ hasError: true });
}
render() {
if (this.state.hasError) {
this.props.history.push("/error");
}
return this.props.children;
}
}
export default withRouter(ErrorBoundary);
解决方案
我只是componentDidCatch()
用来打电话给你的重定向,即
componentDidCatch(error) {
this.props.history.push('/error');
}
我不完全确定调用这样的函数render()
是否有效,但你也可以这样做:
render() {
return this.state.hasError ? <SomeErrorComponent /> : this.props.children;
}
推荐阅读
- google-apps-script - 使用 Appscript 为 PDF 添加水印
- maven - Spark-Shell 不能使用 Netlib-Java
- sql - 下拉列表显示 0
- python - Pandas 中的多重索引导致异常
- python - 为什么我收到“isupper 未定义”错误?
- c# - 为什么我在 IncrementalRefresh 更改消息中没有收到标签 271 大小的条目
- vba - 在 vba excel 中使用 COUNTIF 的 DATE 标准的字符串值
- random - MT19937 不会通过将种子值保持为常数来重现相同的伪随机序列
- mysql - 无法添加或更新子行 MySQL 错误 1452
- git - 如何提及一次以使用 gitignore 忽略来自不同目录的 2 个同名文件夹?