更新的答案
通过将动态导入与React.lazy
. (有关原始代码,请参见下面的初始答案)
import { lazy, Suspense } from "react";
import { Switch, Route } from "react-router-dom";
const Main = () => {
return (
<Switch> {/* The Switch decides which component to show based on the current URL.*/}
<Route exact path='/' component={Home}></Route>
<Suspense fallback="">
{
[...Array(3).keys()].map((i) => {
const artComp = lazy(() => import(`./components/Art${i+1}`));
return (<Route exact path={`/${i+1}`} key={i+1} component={artComp}></Route>);
})
}
</Suspense>
</Switch>
);
}
在代码沙盒上查看更新的演示
代码的作用:
创建一个Suspense
组件来包装Routes
哪些组件将通过React.lazy
.
函数内部map
:
解释:
使用React.lazy
,您可以动态导入模块并将其呈现为常规组件。
React.lazy
接受一个调用动态导入的函数。这将返回一个解析为导入模块的承诺。
注意:导入模块中的组件应该是default export
s,否则 promise 解析为undefined
.
延迟加载意味着仅加载当前需要的内容。由于组件将是惰性组件,它们只会在第一次渲染时加载(即当您第一次单击相应的链接时)。
笔记:
没有为Suspense
答案中的指定回退。
使用 a Suspense
,您可以在等待惰性组件加载时指定要呈现的后备内容(例如加载指示器)。
后备内容可以是 HTML 字符串,例如
fallback={<div>Loading...</div>}
或一个组件,例如:
fallback={<LoadingIndicator/>}
(21.08.21)React.lazy
并且Suspense
还不能用于服务器端渲染。如果您想在服务器渲染的应用程序中执行此操作,React 推荐Loadable Components。
有关更多信息,请查看有关 React.lazy 的 React 文档。
初步答复
这个怎么样?
import Art1 from '...';
import Art2 from '...';
import Art3 from '...';
// and so on
const Main = () => {
const artComponents = {
art1: Art1,
art2: Art2,
art3: Art3,
// and so on
};
return (
<Switch> {/* The Switch decides which component to show based on the current URL.*/}
<Route exact path='/' component={Home}></Route>
{
[...Array(3).keys()].map((i) => {
const artComp = artComponents[`art${i+1}`];
return (<Route exact path={`/${i+1}`} key={i+1} component={artComp}></Route>)
})
}
</Switch>
);
}
这是做什么的:
将“艺术”+路径组件导入文件
注意:组件名称应以大写字母开头。
将导入的组件存储在对象中
创建一个包含 3 个空槽的空数组
注意:替换3
为您需要生成的“艺术”+路径路线的数量。
访问数组的索引
使用这些索引创建一个数组
对于每个数组索引:
根据索引计算需要的“艺术”+路径,并在步骤2中从对象中获取匹配组件
返回 a <Route>
,路径设置基于索引,组件设置为上面的匹配组件
例如索引0
:
artComp
artComponents[1]
又名_Art1
path
将会/1
component
将会Art1