一、路由模塊化(用字典定義路由,然后循環出來)
1.官方文檔參考
【官方文檔】https://reacttraining.com/react-router/web/guides/quick-start
【路由模塊化實例】https://reacttraining.com/react-router/web/example/route-config
2.路由模塊化:實現代碼
其它代碼參考:十七:https://blog.csdn.net/u010132177/article/details/103323644
主要內容:【1】、【2】處
App.js
import React from 'react';
import './App.css';
import { BrowserRouter as Router, Route,Link } from 'react-router-dom'; //引入路由模塊
import Home from './components/home';
import User from './components/user';
//【1】定義一個數組,里面存放route的字典
let routes=[
{
path:'/',
exact:true,
component:Home
},
{
path:'/user/',
component:User
}
]
function App() {
return (
<Router>
<div>
<header className='header'>
<Link to='/'>首頁</Link>
<Link to='user'>個人中心</Link>
</header>
{/* 【2】循環出來剛定義的數組內字典——模塊塊完成。注意此處的routes直接.map即可,不要加this了因為它就定義在頁面上 */}
{
routes.map((v,k)=>{
if(v.exact){
return <Route exact path={v.path} component={v.component} />
}else{
return <Route path={v.path} component={v.component} />
}
})
}
</div>
</Router>
);
}
export default App;
3.路由模塊化:更進一步,把路由單獨放到一個文件里
第一步先把路由定義抽出來:/src/model/routes.js
import Home from '../components/home';
import User from '../components/user';
//【1】定義一個數組,里面存放route的字典
let routes=[
{
path:'/',
exact:true,
component:Home
},
{
path:'/user/',
component:User
}
]
export default routes;
第二步,引入routes.js到 /src/App.js
import React from 'react';
import './App.css';
import { BrowserRouter as Router, Route,Link } from 'react-router-dom'; //引入路由模塊
import routes from './model/routes.js';
function App() {
return (
<Router>
<div>
<header className='header'>
<Link to='/'>首頁</Link>
<Link to='user'>個人中心</Link>
</header>
{/* 【2】循環出來剛定義的數組內字典——模塊塊完成。注意此處的routes直接.map即可,不要加this了因為它就定義在頁面上 */}
{
routes.map((v,k)=>{
if(v.exact){
return <Route exact path={v.path} component={v.component} />
}else{
return <Route path={v.path} component={v.component} />
}
})
}
</div>
</Router>
);
}
export default App;
效果同上
二、嵌套路由父子組件傳值
功能:把根組件的路由、User組件的路由抽出來放到獨立的/model/router.js里做為一個文件,其內部含有根組件的路由,和子組件User.js的路由。以后配置無論哪個組件的路由都到這里去配置即可。
src/App.js
import React from 'react';
import './assets/css/index.css';
import {BrowserRouter as Router,Route,Link} from 'react-router-dom'
import routes from './model/router.js';
function App() {
return (
<Router>
<div>
<header className="title">
<Link to="/">首頁組件</Link>
<Link to="/user">用戶頁面</Link>
<Link to="/shop">商戶</Link>
<Link to="/news">新聞</Link>
</header>
{
routes.map((route,key)=>{
if(route.exact){
return <Route key={key} exact path={route.path}
// route.component value.component <User {...props} routes={route.routes} />
render={props => (
// pass the sub-routes down to keep nesting
<route.component {...props} routes={route.routes} />
)}
/>
}else{
return <Route key={key} path={route.path}
render={props => (
// pass the sub-routes down to keep nesting
<route.component {...props} routes={route.routes} />
)}
/>
}
})
}
</div>
</Router>
);
}
export default App;
src/model/router.js
import Home from '../components/Home';
import User from '../components/User';
import UserList from '../components/User/UserList';
import UserAdd from '../components/User/UserAdd';
import UserEdit from '../components/User/UserEdit';
import Shop from '../components/Shop';
import News from '../components/News';
let routes = [
{
path: "/",
component: Home,
exact:true
},
{
path: "/shop",
component: Shop
},
{
path: "/user",
component: User,
routes:[ /*嵌套路由*/
{
path: "/user/",
component: UserList
},
{
path: "/user/add",
component: UserAdd
},
{
path: "/user/edit",
component: UserEdit
}
]
},
{
path: "/news",
component: News
}
];
export default routes;
src/assets/css/index.css
@charset "UTF-8";
body, div, ul, li, ol, h1, h2, h3, h4, h5, h6, input, textarea, select, p, dl, dt, dd, a, img, button, form, table, th, tr, td, tbody, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
margin: 0;
padding: 0; }
.title{
height: 44px;
line-height:44px;
background: #000;
}
.title a{
color:#fff;
padding:0 20px;
}
/*左右分欄*/
.content{
width:100%;
height: 500px;
display:flex;
}
.content .left{
width:200px;
height: 500px;
background: #eeee;
}
.content .right{
flex:1;
height: 500px;
border:1px solid #000;
}
src/components/Home.js、News.js、Shop.js、User.js
User.js重點,其它都一樣
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
class User extends Component {
constructor(props) {
super(props);
this.state = {
msg:'我是一個User組件'
};
}
componentWillMount(){
console.log(this.props.routes);
}
render() {
return (
<div className="user">
<div className="content">
<div className="left">
<Link to="/user/">用戶列表</Link>
<br />
<br />
<Link to="/user/add">增加用戶</Link>
<br />
<br />
<Link to="/user/edit">編輯用戶</Link>
</div>
<div className="right">
{
this.props.routes.map((route,key)=>{
return <Route key={key} exact path={route.path} component={route.component} />
})
}
{/* <Route path="/user/add" component={UserAdd} /> */}
</div>
</div>
</div>
);
}
}
export default User;
/src/components/User/UserAdd.js、UserEdit.js、UserList.js
內容都一樣除了一些文字
import React, { Component } from 'react';
class UserAdd extends Component {
constructor(props) {
super(props);
this.state = {
msg:'我是一個User組件'
};
}
render() {
return (
<div className="user">
用戶組件UserAdd
</div>
);
}
}
export default UserAdd;