当前正在本教程中介绍如何使用React Router https://reacttraining.com/react-router/web/example/sidebar
创建侧边栏导航系统我计划有多个路由,所以这意味着我必须继续导入路由并将其添加到routes
数组中。是否有一种聪明/正确的方式来动态加载它们?
我所有的组件都在我的/Views
文件夹中。
App.js
import React, { Component } from 'react';
import SideBar from './components/SideBar/SideBar';
import MainContent from './components/MainContent/MainContent';
import { BrowserRouter as Router,
} from 'react-router-dom';
// Import all components here
import Button from './components/Views/Button/Button';
import Color from './components/Views/Color/Color';
import Card from './components/Views/Card/Card';
import Filter from './components/Views/Filter/Filter';
const routes = [
{
path: "/",
name: 'home',
exact: true,
main: () => <h2>Home</h2>
},
{
path: "/button",
name: 'Button',
main: () => <Button />
},
{
path: "/color",
name: 'Color',
main: () => <Color />
},
{
path: "/card",
name: 'Card',
main: () => <Card />
},
{
path: "/filter",
name: 'Filter',
main: () => <Filter />
},
];
class App extends Component {
render() {
return (
<Router>
<div className="ds-container">
<SideBar routes={routes} />
<MainContent routes={routes} />
</div>
</Router>
);
}
}
export default App;
答案 0 :(得分:1)
由于您正在使用内部使用webpack的create-react-app,因此可以查看require-context
。这将帮助您动态导入与某个正则表达式匹配的文件夹中的所有文件。 (例如:以.jsx / .js结尾)
但是,我建议您反对:
path
)与组件本身一起导出。要避免所有这些情况,您只需在index.js
组件中创建一个Views
文件,该文件将需要您创建的任何新路由组件,并返回在{中形成的最终数组{1}}文件。
从本质上讲, /Views/index.js :
App.js
在 SideBar.js 中:
// Import all components here
import Button from './components/Views/Button/Button';
import Color from './components/Views/Color/Color';
import Card from './components/Views/Card/Card';
import Filter from './components/Views/Filter/Filter';
const routes = [
{
path: "/",
name: 'home',
exact: true,
main: () => <h2>Home</h2>
},
{
path: "/button",
name: 'Button',
main: () => <Button />
},
{
path: "/color",
name: 'Color',
main: () => <Color />
},
{
path: "/card",
name: 'Card',
main: () => <Card />
},
{
path: "/filter",
name: 'Filter',
main: () => <Filter />
},
// add new routes here
];
export default routes;
这样,您可以清理App.js中的代码,并且还可以有效地分离各个组件的关注点。
我希望这是有道理的:)
答案 1 :(得分:0)
有几种方法可以根据当前位置选择主要组件。但是所有这些都需要列出所有可能的路线并导入相应的组件。您可以使用dynamic imports和React.lazy来简化代码拆分。
但是您可以避免对侧边栏进行额外的配置。侧边栏可以从全局状态获取配置,并且您的主要组件可以在挂载(componentDidMount
或useEffect(() => {...}, [])
)上更新该状态:
const SideBarContext = React.createContext(() => {});
function useSidebar(name) {
const setSidebarName = useContext(SideBarContext);
useEffect(() => {
setSidebarName(name);
return () => setSidebarName(null);
}, []);
}
function Home() {
useSidebar('home');
return <h2>Home</h2>;
}
function Button() {
useSidebar('Button');
return <button>press me</button>;
}
function App() {
const [name, setName] = useState(null);
return (
<Router>
<div className="ds-container">
<SideBar name={name} />
<SideBarContext.Provider value={setName}>
<Route path="/" exact component={Home}/>
<Route path="/button" component={Button}/>
</SideBarContext.Provider>
</div>
</Router>
);
}
因此,每个组件都会考虑侧边栏的选项,您只需导入它们并添加Route
。