Rub*_*ada 5 lazy-evaluation reactjs
我正在尝试加载选项卡组件内的组件以进行反应。这个想法是有一个带有以下语法的 json (或更好的 yaml):
interface TabType {
name: string;
components: string[];
}
interface Templates {
tabs: TabType[];
}
const templateTabsModules: Templates = {
tabs: [
{
name: "Title for Tab 1",
components: ["./components/OneComponent"]
},
{
name: "Title for Tab 2",
components: ["./components/TwoComponent"]
}
]
};
Run Code Online (Sandbox Code Playgroud)
因此,在主组件内部执行以下操作:
<Tabs id="tab">
{templateTabsModules.tabs.map(tab => {
return (
<Tab title={tab.name}>
<p>The component should appears bellow:</p>
<Suspense fallback={<div>Loading</div>}>
{tab.components.map(component => {
const Comp = lazy(() => import(component));
return (<Comp />)
})}
</Suspense>
</Tab>
);
})}
</Tabs>
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用,我可以看到,如果我仅使用路径作为字符串const Comp = lazy(() => import('./components/OneComponent'));,那么它就可以工作,但如果我使用动态变量则不会。
我找到了一个可能的解决方案,可以通过执行以下操作来完成我需要的操作,而无需在组件之前进行声明:
<Tabs id="tab">
{templateTabsModules.tabs.map((tab, index) => {
return (
<Tab title={tab.name} key={index}>
<p>The component should appears bellow:</p>
<Suspense fallback={<div>Loading</div>}>
tab.components.map(component => {
const Comp = lazy(() => import(
/* webpackChunkName: "my-chunk-name" */
/* webpackMode: "lazy" */
`${component}`
).then(comp => comp));
return (<Comp />)
})}
</Suspense>
</Tab>
);
})}
</Tabs>
Run Code Online (Sandbox Code Playgroud)
因此 Webpack 可以加载组件并将其作为 Promise 返回
示例-> https://codesandbox.io/s/lazy-components-with-react-mix9y
| 归档时间: |
|
| 查看次数: |
2518 次 |
| 最近记录: |