我正在尝试在Tab组件内部加载组件以进行反应。这个想法是使用此syntanx制作的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"]
}
]
};
因此,在主要组件内部执行以下操作:
<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>
但是此代码不起作用,我可以看到,如果通过执行const Comp = lazy(() => import('./components/OneComponent'));
仅将路径用作字符串,则可以,但是如果使用动态变量,则不能。
答案 0 :(得分:1)
Webpack正在尝试最好排除所有不需要的文件。
我认为,如果您之前定义了const并在循环中引用它们,那应该会起作用
const Comp1 = lazy(() => import('./components/OneComponent'));
const Comp2 = lazy(() => import('./components/TwoComponent'));
...
tabs: [
{
name: "Title for Tab 1",
component: Comp1
},
{
name: "Title for Tab 2",
component: Comp2
}
]
...
<Suspense fallback={<div>Loading</div>}>
{tabs.map(tab => tab.component)}
</Suspense>
答案 1 :(得分:1)
我找到了一种可能的解决方案,该解决方案无需执行以下操作即可完成我需要的工作:
<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>
因此,Webpack可以加载组件并按承诺将其返回
示例-> https://codesandbox.io/s/lazy-components-with-react-mix9y