我正在使用一些非常标准的create-react-app样板,它使用延迟加载和react-i18next作为翻译库。这个库使用i18next-http-backend从远程API获取翻译文件。
我想了解的是,到底是如何反应。悬疑是能够"认出"的。此异步调用,并显示回退UI,直到它完成。
索引。ts文件:
import "./i18n";//Notice this
const container = document.getElementById("root");
ReactDOM.render(
<StylesProvider jss={jss}>
<ThemeProvider theme={theme}>
<React.StrictMode>
<BrowserRouter>
<Router />
</BrowserRouter>
</React.StrictMode>
</ThemeProvider>
</StylesProvider>,
container
);
i18n文件:
i18n
.use(Backend)
.init({
backend:{
loadPath: 'https://someRemoteApi/dictionary',
})
路由器:
const Home = lazy(() => import("../../modules/home/Home"));
const Router: React.FC = (props) => {
return (
<>
<ErrorBoundary>
<Suspense fallback={<div className={styles.loader}><Loader /></div>}>
<Switch>
<ProtectedRoute exact component={Home} path="/"/>
...more routes
</Suspense>
</ErrorBoundary>
</>
);
};
通过这种设置,令我惊讶的是,回退呈现在屏幕上,直到这个后端插件完成它的工作。我正试图理解它的机制,以及这是否可以用于其他异步操作.
React文档明确声明:
反应。在某些情况下,悬念允许您指定加载指示器下面树中的组件还没有准备好渲染。今天,的唯一支持的用例是延迟加载组件& lt; React.Suspense>
如能澄清,不胜感激。
Suspense
的想法是当组件抛出Promise
(或在组件渲染期间调用的任何东西)时,React
寻找最接近的Suspense
以显示回退UI。
在您的例子中,您的组件正在使用useTranslate
钩子。当namespaces
还没有加载时,它抛出一个Promise
并加载namespaces
。在渲染阶段,React捕获抛出的Promise
,并在树中寻找最接近的Suspense
组件,以便显示回退UI。
这是钩子useTranslation
的一个片段:
// not yet loaded namespaces -> load them -> and trigger suspense
throw new Promise((resolve) => {
loadNamespaces(i18n, namespaces, () => {
resolve();
});
});
你可以从这里查看钩子useTranslation
是如何工作的