2020 년 4 월 업데이트 :
이 문제는 최신 React 16.13.1에서 수정 된 것으로 보입니다 ( 이 샌드 박스 예 참조) . 이것을 지적 해 준 @abernier에게 감사합니다.
나는 약간의 연구를 해왔고 중요한 한 가지 차이점을 발견했다.
React는 비동기 라이프 사이클 방법의 오류를 처리하지 않습니다.
따라서 다음과 같이 작성하면
componentDidMount()
{
throw new Error('I crashed!');
}
그러면 귀하의 오류가 오류 경계에 오류 를 처리하여 우아한 메시지를 표시 할 수 있습니다.
다음과 같이 코드를 변경하면 :
async componentDidMount()
{
throw new Error('I crashed!');
}
이것은 이것과 같습니다 :
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
그때 오류가 자동으로 삼켜 질 것입니다 집니다. 부끄러운 줄 알아
그렇다면 어떻게 오류를 처리합니까? 유일한 방법은 다음과 같이 명시 적으로 잡는 것 같습니다.
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
또는 이와 같이 :
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
여전히 오류가 오류 경계에 도달하기를 원한다면 다음 트릭을 생각할 수 있습니다.
- 오류를 잡아서 오류 처리기가 구성 요소 상태를 변경하게합니다.
- 상태가 오류를 나타내는 경우
render
메소드 에서 오류를 처리하십시오.
예:
class BuggyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
}
buggyAsyncfunction(){ return Promise.reject(new Error('I crashed async!'));}
async componentDidMount() {
try
{
await this.buggyAsyncfunction();
}
catch(error)
{
this.setState({error: error});
}
}
render() {
if(this.state.error)
throw this.state.error;
return <h1>I am OK</h1>;
}
}