我有一个组件,我在其中获取模拟数据.我正在使用带着悬念的Reaction-Query进行查询.我在跟踪他们的docs美元.这是组件:

export const WorkHistory = () => {
    const { caseId } = useContext();
    const { api: mockApi } = useMockApi();
    const { data: workHistory } = mockApi.getWorkHistory(caseId.toString());

    return (
        <QueryErrorResetBoundary>
            {({ reset }) => (
                <ErrorBoundary
                    fallbackRender={({ error, resetErrorBoundary }) => (
                        <div>
                            There was an error! <Button onClick={() => resetErrorBoundary()}>Try again</Button>
                            <pre style={{ whiteSpace: "normal" }}>{error.message}</pre>
                        </div>
                    )}
                    onReset={reset}
                >
                    <Suspense
                        fallback={
                            <div className="flex justify-center">
                                <Loader size="3xlarge" title="Loading..." />
                            </div>
                        }
                    >
                        <WorkHistory workHistory={workHistory} />
                    </Suspense>
                </ErrorBoundary>
            )}
        </QueryErrorResetBoundary>
    );
};

这是moockApi中的getWorkHistory:

const getWorkHistory = (caseId: string) =>
        useQuery({
            queryKey: `workHistory`,
            queryFn: (): Promise<WorkHistoryDto[]> => fakeFetch(JSON.parse(localStorage.getItem(`workHistory`))),
            staleTime: Infinity,
            suspense: true,
        });

const fakeFetch = (result): Promise<any> =>
        new Promise((resolve, reject) => {
            setTimeout(() => reject(new Error("fail")), 1000);
        });

但是,这ErrorBoundary并没有捕捉到这个错误.我明白了:

Uncaught Error: fail

我到底做错了什么?

推荐答案

您正在呼叫错误边界之外的useQuery:

export const WorkHistory = () => {
    // ⬇️ useQuery is called here
    const { data: workHistory } = mockApi.getWorkHistory(caseId.toString());

    return (
        <QueryErrorResetBoundary>
            {({ reset }) => (
            // ⬇️ your ErrorBoundary starts here
                <ErrorBoundary
                  ...
                </ErrorBoundary>
            )}
        </QueryErrorResetBoundary>
    );
};

调用useQuery会将错误抛出到最接近的Errance边界,因此它必须是Error边界的inside,而不是它的上方.


无关,但仍然重要的是:您在名为getWorkHistory的函数中调用useQuery违反了钩子规则.钩子必须在函数组件或其他钩子中调用,因此您需要将该函数命名为useWorkHistoryuseGetWorkHistory.

Reactjs相关问答推荐

如何在Pivot模式下自定义标题?

NextJs Form不允许我输入任何输入,

是否可能有不同的加载器用于路径有查询参数和没有查询参数,或者在React Router 6中添加它们时有条件地跳过一个加载器?

如何使用Reducer更新全局变量

Reaction Hook';useEffect&;有条件呼叫问题:

捕获表单数据时的Reactjs问题

React Context未正确更新

页面永远加载API/从数据库获取数据

使用VITE的Reaction应用程序的配置是否正确?

带有样式的工具提示导致无法向功能组件提供参考警告

设置自定义形状的纹理

如何更新redux状态存在的输入框

React js中不记名令牌中的空间问题

未捕获的类型错误:useSelector 不是函数

如何解决在 react.js 中找不到模块错误

如何从 extrareducer redux 更改对象中元素的值

如何根据react 中的 map 功能一次只打开一个弹出窗口?

如何在 Reactjs 中判断受保护路由上的用户角色?

单击按钮时获取react 表中每一行的属性

React-Native PDF 注释