构建应用程序时,错误是不可避免的。它们可能来自 API、UI 或其他几个地方。
尽管有这些错误,但优雅地处理这些错误并保持良好的用户体验非常重要。
错误边界是 React 中错误处理的一种方式。
为了理解这一点,我们先了解一下引入误差边界之前的情况。
在错误边界之前,组件内部发生的错误最终会传播并破坏 UI 或呈现白屏。
这导致了非常糟糕的用户体验。
错误边界帮助我们处理此类错误并显示后备 UI,而不是破坏 UI 或显示白屏。
React v16 正式引入了Error Boundary。
它是一个基于类的组件,可用于包装您的应用程序。
它接受要显示的后备 UI,以防您的应用程序出现错误或其他情况,它只是渲染子组件以恢复应用程序的正常流程。
这是 React 文档建议的使用方式,
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true }; } componentDidCatch(error, info) { // Example "componentStack": // in ComponentThatThrows (created by App) // in ErrorBoundary (created by App) // in div (created by App) // in App logErrorToMyService(error, info.componentStack); } render() { if (this.state.hasError) { // You can render any custom fallback UI return this.props.fallback; } return this.props.children; } }
它无法捕获
中发生的错误有一个名为react-error-boundary的npm包,它是传统错误边界组件之上的包装器。
使用这个包,我们能够克服传统错误边界组件中面临的所有问题。
您可以使用 .
包装整个应用程序,也可以使用 .包装单个组件
实施的粒度由您决定。
让我们了解如何使用它。
import React from 'react'; import { ErrorBoundary } from "react-error-boundary"; const App = () => { return <ErrorBoundary fallback={<div>Something went wrong</div>}> /* rest of your component */ </ErrorBoundary> }
这是使用 ErrorBoundary 的最简单的示例。这个库还有更多内容。
让我们尝试了解不同场景下的 API。
1。我想针对应用程序中的错误显示通用后备 UI
import React from 'react'; import { ErrorBoundary } from "react-error-boundary"; const App = () => { return <ErrorBoundary fallback={<div>Something went wrong</div>}> /* rest of your component */ </ErrorBoundary> }
2。我想在我的后备组件中显示特定的错误详细信息
import React from 'react'; import { ErrorBoundary } from "react-error-boundary"; function fallbackRender({ error, resetErrorBoundary }) { // Call resetErrorBoundary() to reset the error boundary and retry the render. return ( <div role="alert"> <p>Something went wrong:</p> <pre style={{ color: "red" }}>{error.message}
除了fallback或fallbackRender,你还可以使用React组件。
import React from 'react'; import { ErrorBoundary } from "react-error-boundary"; const Fallback = ({ error, resetErrorBoundary }) => { // Call resetErrorBoundary() to reset the error boundary and retry the render. return ( <div role="alert"> <p>Something went wrong:</p> <pre style={{ color: "red" }}>{error.message}
3。我想记录我的错误
import React from 'react'; import { ErrorBoundary } from "react-error-boundary"; const logError = (error: Error, info: { componentStack: string }) => { // Do something with the error, e.g. log to an external API }; const Fallback = ({ error, resetErrorBoundary }) => { // Call resetErrorBoundary() to reset the error boundary and retry the render. return ( <div role="alert"> <p>Something went wrong:</p> <pre style={{ color: "red" }}>{error.message}
4。我想捕获事件处理程序和异步代码中的错误
import { useErrorBoundary } from "react-error-boundary"; function Example() { const { showBoundary } = useErrorBoundary(); const getGreeting = async(name) => { try { const response = await fetchGreeting(name); // rest of your code } catch(error){ // Show error boundary showBoundary(error); } } useEffect(() => { getGreeting() }); return <Whatever UI you want to render/> }
ErrorBoundary 是一个客户端组件。您只能将可序列化的属性传递给它,或者在具有“使用客户端”的文件中使用它;指令。
1。什么是可序列化的 prop?
Serilzable prop 意味着它可以转换为字节流,这样字节流就可以转换回原始 prop。
在 Javascript 中执行此操作的常见方法是 JSON.stringify() 和 JSON.parse()。
2。如何使用“使用客户端”;指令?
只需在文件顶部提及即可
"use client";
您还可以使用更多的变体。但这篇文章足以让您入门。
在这里查看他们的完整文档。
如果您觉得有帮助,请在评论中告诉我。
编码快乐!
以上是掌握 React 中的错误边界:有效错误处理指南的详细内容。更多信息请关注PHP中文网其他相关文章!