React使用配置文件生成路由(类似于vue的路由配置)
废话不多说,直接上代码,后面会附上项目地址
1、创建react工程,运行 npm install react-router-dom@5.2.0 --save
2、在src里面新建router文件夹,文件夹目录如下

3、在router文件夹里面新建index.jsx
import React, { Component } from 'react';
import { Route, Switch, Redirect, HashRouter, withRouter } from "react-router-dom";
import Config from './config'
class Router extends Component {
//递归生成路由文件
generateRoute(ele) {
if (ele.children) {
if (ele.component) {
return (
<Route key={ele.name} path={ele.path} render={() => (
<ele.component>
{
ele.children.map((item) => {
return this.generateRoute(item)
})
}
</ele.component>
)}>
</Route>
)
} else {
return (
<Route key={ele.name} render={() => (
ele.children.map((item) => {
return this.generateRoute(item)
})
)}>
</Route>
)
}
}
if (ele.redirect) {
return <Route exact key={ele.name} path={ele.path} render={
() => (
<Redirect to={ele.redirect} />)}>
</Route>
} else {
return <Route exact key={ele.name} path={ele.path} component={ele.component} />
}
}
render() {
return (
<HashRouter>
<Switch>
{
Config.map(item => {
return this.generateRoute(item)
})
}
</Switch>
</HashRouter>
);
}
}
export default withRouter(Router);
4、在router文件夹里面新建config.jsx
import Layout from '../views/layout/layout';
import A from '../views/pages/a';
import B from '../views/pages/b';
import Login from '../views/pages/login';
const router = [
{
path: '/',
name: "Login",
auto: false,
component: Login,
},{
redirect: '/Layout',
path: '/Layout',
component: Layout,
name: "Layout",
auto: true,
children: [
{
path: "/Layout/A",
name: "介绍",
auto: true,
component: A,
}, {
path: "/Layout/B",
name: "设计原则",
auto: true,
component: B,
}
]
}
]
export default router;
5、删除src文件夹里面的app.js、app.css文件,index.js文件修改如下:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import Router from "./router";
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
<Router />
</BrowserRouter>
</React.StrictMode>,
document.getElementById('root')
);
6、路由嵌套时,上层需要组件需要{props.children} 如下:
import React, { PureComponent } from 'react'
class Layout extends PureComponent {
constructor(props) {
super(props)
this.state = {
}
}
render() {
return (
<div>
<div>
<a href="/#/Layout/A">A页面</a>
<a href="/#/Layout/B">B页面</a>
</div>
{this.props.children} {/* 嵌套的子路由 */}
<div><a href="/">返回</a></div>
</div>
)
}
}
export default Layout
7、在src里面新建views文件夹,然后新建几个页面,在config.js文件夹里面引入就可以了,我建的文件夹在项目在github里面
8、github地址 https://github.com/lzx-cloud/examples-h5/tree/main/react-router

浙公网安备 33010602011771号