Error Boundary 用于捕获子组件树中的 JavaScript 错误,显示备用 UI。

示例 1: 基本用法

计数: 0

当计数达到 3 时会触发错误

class ErrorBoundary extends Component {
  static getDerivedStateFromError(error) {
    return { hasError: true, error };
  }

  componentDidCatch(error, errorInfo) {
    console.error('Error:', error);
  }

  render() {
    if (this.state.hasError) {
      return <ErrorFallback />;
    }
    return this.props.children;
  }
}

示例 2: 隔离错误边界

Widget A

0

Widget B

0

Widget C

0

优势: 每个 Widget 有独立的错误边界, 一个崩溃不会影响其他组件。

示例 3: 事件处理器中的错误

// Error Boundary 无法捕获事件处理器中的错误
// 需要使用 try-catch

const handleClick = () => {
  try {
    doSomethingRisky();
  } catch (error) {
    setError(error.message);
  }
};
注意: Error Boundary 只能捕获渲染时的错误, 事件处理器和异步代码中的错误需要用 try-catch 手动处理。

示例 4: 让 Error Boundary 捕获异步错误

点击按钮模拟异步错误

// 自定义 Hook:让异步错误能被 Error Boundary 捕获
function useAsyncError() {
  const [, setError] = useState();

  return useCallback((error: Error) => {
    setError(() => {
      throw error; // 在渲染时抛出错误
    });
  }, []);
}

// 使用
const throwError = useAsyncError();
fetchData().catch(throwError);

示例 5: 优雅降级策略

📊 交互式图表

降级策略: 当交互式组件失败时,显示功能受限但仍可用的静态版本, 而不是错误信息,提供更好的用户体验。