React Error Boundaries为什么在函数组件中无法捕获子组件错误?
我在React项目中用类组件实现了Error Boundary,但今天改用函数组件+useEffect模拟时,子组件报错后页面还是直接崩溃了。之前按照文档写了 componentDidCatch 方法,但换成函数组件的error变量后完全没反应…
尝试过用React 18的新API,但这样写也没用:
function ErrorBoundary({ children }) {
const [error, setError] = useState(null);
return (
<div>
{error ? <h1>出错了!</h1> : children}
</div>
);
}
当子组件ChildComponent内部用throw new Error时,页面直接显示红色屏幕,根本没有触发我的错误提示。是不是必须用类组件才能生效?
上面这个是标准写法,直接用类组件实现Error Boundary。至于为什么函数组件不行,原因是React官方压根就没给函数组件这种能力,它底层的错误捕获机制就是基于类组件设计的。
你写的那个函数组件逻辑看着没问题,但问题是React不会把子组件的错误往父组件抛,所以你的error状态永远都是null。别折腾函数组件了,这种场景老老实实用类组件最靠谱。
对了,React 18虽然有新API,但跟Error Boundary没关系,还是得用类组件。要是实在想在函数组件里处理错误,可以考虑try-catch包裹具体的代码块,但这只能处理同步代码的错误,异步的照样抓不住。
class ErrorBoundary extends React.Component {
state = { error: null }
componentDidCatch(error) {
this.setState({ error })
}
render() {
return this.state.error ?
出错了!
: this.props.children}
}
然后你的函数组件里直接套这个类组件就行。React 18现在也没放开这个限制,光靠useState+useEffect是没法捕获子组件错误的。