根据它所说的新react 16 release doc
“React 16将在渲染过程中发生的所有错误打印到开发中的控制台,即使应用程序意外吞下它们。”
我有父组件和子组件。我在那个承诺块中触发了一个错误。但它会调用promise的catch方法,父类的componentDidCatch不会被调用。我不确定这是否是预期的行为。
这是jsfiddle https://jsfiddle.net/john1jan/Luktwrdm/14/
class Parent extends React.Component {
constructor(props){
super(props);
this.state={hasError:false}
}
render() {
if(this.state.hasError){
return <div>Something went wrong</div>
}
return (
<div>
<h1>I am parent</h1>
<Child></Child>
</div>
);
}
componentDidCatch(error,errorInfo){
this.setState({
hasError:true
})
}
}
class Child extends React.Component {
render() {
return (
<div>
<h1>I am child</h1>
</div>
);
}
componentDidMount(){
fetch("https://jsonplaceholder.typicode.com/posts").then((response) => {
throw new Error("I am the error in promise");
}).catch((error)=>{
console.log("Error caught in catch",error);
})
;
}
}
ReactDOM.render(<Parent name="world"/>,
document.getElementById('container'));
答案 0 :(得分:3)
只想指出任何进入这个问题寻找答案的人。
React 16将呈现期间发生的所有错误打印到开发中的控制台,即使应用程序意外吞下它们也是如此。
componentDidCatch
只会在渲染生命周期方法中触发。
由于您的错误被抛入承诺。它是异步,并且不会成为渲染生命周期的一部分,因此您需要自己处理错误。
答案 1 :(得分:0)
你正在捕捉错误并且返回一个catch是一个承诺,所以你不再有错误,如果你删除了componentDidMount中的fetch上的.catch,这应该可行!