我做了一个简单的测试来捕获来自MyComponent组件的错误,但是在崩溃之后,错误信息没有显示在DOM中,而是在下面的代码中描述。在控制台中,它显示正常。
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import './index.css';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
counter: 0,
error: null,
errorInfo: null
};
}
handleClick = () => {
this.setState({ counter: this.state.counter + 1 })
}
componentDidCatch(error, errorInfo) {
this.setState({
error: true,
errorInfo: errorInfo
});
}
render() {
if (this.state.counter > 5) {
throw new Error('Ooops!');
return(
<React.Fragment> // this is were Error must displayed
<div>{this.state.error.toString()}</div>
<div>{this.state.errorInfo.componentStack}</div>
</React.Fragment>
);
}
return <div style={{cursor: 'pointer'}} onClick={this.handleClick}>Click Me: {this.state.counter}</div>
}
}
ReactDOM.render(
<MyComponent />,
document.getElementById('root')
);/控制台中的错误日志:
Uncaught Error: Ooops!
at MyComponent.render (index.js:30)
at finishClassComponent (react-dom.development.js:7873)
at updateClassComponent (react-dom.development.js:7850)
at beginWork (react-dom.development.js:8225)
at performUnitOfWork (react-dom.development.js:10224)
at workLoop (react-dom.development.js:10288)
at HTMLUnknownElement.callCallback (react-dom.development.js:542)
at Object.invokeGuardedCallbackDev (react-dom.development.js:581)
at invokeGuardedCallback (react-dom.development.js:438)
at renderRoot (react-dom.development.js:10366)
at performWorkOnRoot (react-dom.development.js:11014)
at performWork (react-dom.development.js:10967)
at batchedUpdates (react-dom.development.js:11086)
at batchedUpdates (react-dom.development.js:2330)
at dispatchEvent (react-dom.development.js:3421)
render @ index.js:30
finishClassComponent @ react-dom.development.js:7873
updateClassComponent @ react-dom.development.js:7850
beginWork @ react-dom.development.js:8225
performUnitOfWork @ react-dom.development.js:10224
workLoop @ react-dom.development.js:10288
callCallback @ react-dom.development.js:542
invokeGuardedCallbackDev @ react-dom.development.js:581
invokeGuardedCallback @ react-dom.development.js:438
renderRoot @ react-dom.development.js:10366
performWorkOnRoot @ react-dom.development.js:11014
performWork @ react-dom.development.js:10967
batchedUpdates @ react-dom.development.js:11086
batchedUpdates @ react-dom.development.js:2330
dispatchEvent @ react-dom.development.js:3421
index.js:2178 The above error occurred in the <MyComponent> component:
in MyComponent (at index.js:43)
Consider adding an error boundary to your tree to customize error handling behavior.
Visit s to learn more about error boundaries.
__stack_frame_overlay_proxy_console__ @ index.js:2178
logCapturedError @ react-dom.development.js:9747
captureError @ react-dom.development.js:10540
renderRoot @ react-dom.development.js:10391
performWorkOnRoot @ react-dom.development.js:11014
performWork @ react-dom.development.js:10967
batchedUpdates @ react-dom.development.js:11086
batchedUpdates @ react-dom.development.js:2330
dispatchEvent @ react-dom.development.js:3421
index.js:30 Uncaught Error: Ooops!
at MyComponent.render (index.js:30)
at finishClassComponent (react-dom.development.js:7873)
at updateClassComponent (react-dom.development.js:7850)
at beginWork (react-dom.development.js:8225)
at performUnitOfWork (react-dom.development.js:10224)
at workLoop (react-dom.development.js:10288)
at HTMLUnknownElement.callCallback (react-dom.development.js:542)
at Object.invokeGuardedCallbackDev (react-dom.development.js:581)
at invokeGuardedCallback (react-dom.development.js:438)
at renderRoot (react-dom.development.js:10366)
at performWorkOnRoot (react-dom.development.js:11014)
at performWork (react-dom.development.js:10967)
at batchedUpdates (react-dom.development.js:11086)
at batchedUpdates (react-dom.development.js:2330)
at dispatchEvent (react-dom.development.js:3421)/
发布于 2018-03-05 00:21:10
当您之前抛出错误时,可能不会引发显示错误的html。试着这样做:
render() {
if (this.state.counter > 5) {
throw new Error('Ooops!');
}
return (
<div>
<div style={{cursor: 'pointer'}} onClick={this.handleClick}>Click Me: {this.state.counter}</div>
{ this.state.error &&
<React.Fragment>
<div>{this.state.error.toString()}</div>
<div>{this.state.errorInfo.componentStack}</div>
</React.Fragment>
}
</div>
);
}发布于 2018-03-05 00:22:38
我认为这段代码不起作用,因为当你抛出一个错误时,函数中Javascript的执行就会停止:
render() {
if (this.state.counter > 5) {
throw new Error('Ooops!');
// HERE, after the Error, the exution is stopped, and all the code below is ignored.
return(
<React.Fragment> // this is were Error must displayed
<div>{this.state.error.toString()}</div>
<div>{this.state.errorInfo.componentStack}</div>
</React.Fragment>
);
}
return <div style={{cursor: 'pointer'}} onClick={this.handleClick}>Click Me: {this.state.counter}</div>
}您可以做的是在抛出错误时使用try/catch块,或者如果错误信息存在,则只呈现错误信息,例如:
render() {
if (this.state.error) {
return(
<React.Fragment> // this is were Error must displayed
<div>{this.state.error.toString()}</div>
<div>{this.state.errorInfo.componentStack}</div>
</React.Fragment>
);
}
if (this.state.counter > 5) {
throw new Error('Ooops!');
}
return <div style={{cursor: 'pointer'}} onClick={this.handleClick}>Click Me: {this.state.counter}</div>
}发布于 2018-03-05 00:47:43
这就是您可以做的--在错误检查器MyComponent组件中包含可执行的Component组件。这将是一项工作:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
error: null,
errorInfo: null
};
}
componentDidCatch(error, errorInfo) {
this.setState({
error: error,
errorInfo: errorInfo
});
}
render() {
if (this.state.errorInfo) {
return(
<React.Fragment>
<div>{this.state.error && this.state.error.toString()}</div>
<div>{this.state.errorInfo.componentStack}</div>
</React.Fragment>
);
}
return this.props.children;
}
}
class Component extends React.Component {
constructor(props) {
super(props);
this.state = {
counter: 0,
};
}
handleClick = () => {
this.setState({ counter: this.state.counter + 1 })
}
render() {
if (this.state.counter > 5) {
throw new Error('Ooops!');
}
return <div style={{cursor: 'pointer'}} onClick={this.handleClick}>Click Me: {this.state.counter}</div>
}
}
ReactDOM.render(
<MyComponent>
<Component />
</MyComponent>,
document.getElementById('root')
);https://stackoverflow.com/questions/49097373
复制相似问题