【问题标题】:When to use React Error Boundary Components?何时使用 React 错误边界组件?
【发布时间】:2022-01-07 12:38:00
【问题描述】:

我们什么时候应该使用错误边界组件?只是因为缺少道具之类的东西?

例如,想象一下这个 api 抓取钩子:

const useFetch = () => {
   ...
    
   const [error, setError] = useState(null);
 
   const method = async () => {
     try {
        await api.fetchData();
     } catch(err) {
       setError(err);
     }
   };

   useEffect(() => {
     method();
   },[]);

   return { ..., error };
}

现在,在一个组件中,我只是这样做:

const MyComponent = () => {
   const { error } = useFetch();

   if (error) return <FallbackUI />;

   return <MainUI />;
}

我可以使用 ErrorBoundary 组件来处理这种情况(api 调用错误)而不是条件渲染吗?

编辑

如果我只想在我的获取数据方法失败并且之前检索到任何数据时显示后备 UI,那该怎么办?

类似:

const { data, getMoreData, error } = useFetchPosts(); // data is stateful inside the hook
  
if (error && !data) return <FallbackUI />;

return <MainUI data={data} />;

【问题讨论】:

    标签: javascript reactjs react-native


    【解决方案1】:

    我在我的项目中遵循了以下方法,这些方法都是钩子/功能组件实现。

    我正在使用https://github.com/bvaughn/react-error-boundary

    import { ErrorBoundary } from "react-error-boundary";
    
    <ErrorBoundary FallbackComponent={ErrorFallback}>
       <MyComponent />
    </ErrorBoundary>   
    
    //reject the promise so it gets bubbled up
    const useFetch = () => {
       ...
        
       const [error, setError] = useState(null);
     
       const method = async () => {
         try {
            await api.fetchData();
         } catch(err) {
           // setError(err);
          return Promise.reject(err);
         }
       };
    
       useEffect(() => {
         method();
       },[]);
    
       return { ..., error };
    }  
    
    
    function ErrorFallback({ error }: { error: any }) {
      return (
        <>
          // you custom ui you'd like to return
        </>
      );
    }  
    

    编辑:

    我通常在顶层有这个,所以这通常是所有未处理异常的全部捕获。换句话说,我将我的App.tsx 包装在ErrorBoundary 的根index.tsx 文件中。所以,我的代码看起来更像这样

     ...
     <ErrorBoundary FallbackComponent={ErrorFallback}>
        <SWRConfig ...>
           <React.StrictMode>
              <ScrollToTop></ScrollToTop>
                 <App ... />
           </React.StrictMode>
          </SWRConfig>
      </ErrorBoundary>
       
    

    【讨论】:

    • 哦,谢谢!我曾想过对重新启动 UI 的应用程序做同样的事情(包装所有组件树)。但是......典型的重试器等呢?我的意思是,例如,如果我想在其他获取数据的组件中呈现重试器组件,我应该为此使用特定的错误边界吗?还是有条件地渲染回退或者组件的内容?
    • 我的意思是,想象一个组件进行 2 次获取(使用相同的方法)。如果我只想在第一次获取失败时呈现回退 UI(忽略第二次),这应该使用错误边界或条件呈现来处理?
    • 类似: const { data, error } = useFetch(someUri); if(!data && error) 返回 ;
    • hm..,不确定,我能做的最好是推荐您参考 kent dodds 的这篇文章 kentcdodds.com/blog/…
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2020-01-16
    • 2019-02-20
    • 2018-08-14
    相关资源
    最近更新 更多