React+Router多級(jí)導(dǎo)航切換路由方式
背景
我們需要開(kāi)發(fā)一個(gè)管理平臺(tái),登陸、注冊(cè)及網(wǎng)站首頁(yè)等不需要加載用戶信息的頁(yè)面放置在系統(tǒng)外部
系統(tǒng)內(nèi)部則是需要驗(yàn)證用戶身份及其角色的頁(yè)面。
文件結(jié)構(gòu)
注:輸出文件樹(shù)及文件 tree ./src /F
│ index.html 頁(yè)面文件入口 │ index.js js文件入口 │ style.scss ├─actions │ api.js │ base.js ├─containers │ │ contentMain.jsx 填充layout中的content部分 │ │ layout.jsx 系統(tǒng)頁(yè)面中的布局,包含菜單導(dǎo)航 │ │ noPage.jsx 頁(yè)面走丟 │ │ personal.jsx │ │ style.scss │ ├─account │ │ new.jsx │ │ table.jsx │ ├─clients │ │ new.jsx │ │ table.jsx │ ├─firms │ │ new.jsx │ │ table.jsx │ ├─index │ │ index.jsx │ │ items.jsx │ │ style.scss │ ├─login │ │ index.jsx │ │ style.scss │ └─resetpassword │ index.jsx │ style.scss └─ xxxxx···
最外層路由
import React from 'react'; import {render} from 'react-dom'; import {Provider} from 'react-redux'; import { HashRouter as Router, Route, Switch } from 'react-router-dom'; const IndexPage = require('./containers/index/index').default; const Layout = require('./containers/layout').default; const Login = require('./containers/login').default; const RestPassWord = require('./containers/resetpassword').default; const NotFoundPage = require('./containers/noPage').default; import configureStore from './store'; import './style.scss' const store = configureStore(); render( <Provider store={store}> <Router> <Switch> <Route path="/main" component={Layout} /> //模糊匹配,只要路由中有/main就會(huì)加載Layout組件 <Route exact path="/index" component={IndexPage} /> // 精確匹配 <Route exact path="/login" component={Login} /> <Route exact path="/reset" component={RestPassWord} /> <Route component={NotFoundPage} /> </Switch> </Router> </Provider>, document.getElementById('root') );
二級(jí)路由
在Layout組件中,對(duì)路由繼續(xù)匹配
# Layout import React, { Component } from 'react'; import { Layout, Menu, Avatar, Icon , Dropdown} from 'antd'; import {Link} from 'react-router-dom'; import ContentMain from './contentMain'; import { createHashHistory } from 'history'; import './style.scss'; const history = createHashHistory(); const { Header, Content, Footer, Sider } = Layout; const { SubMenu } = Menu; export default class LayoutPagae extends Component { state = { collapsed: false, user: 'Liz', }; onCollapse = collapsed => { console.log(collapsed); this.setState({ collapsed }); }; handleLoginOut = e => { e.preventDefault(); history.push('/login'); }; render() { const menu = ( <Menu> <Menu.Item> <Link to={'/main/personal'}>個(gè)人中心</Link> </Menu.Item> <Menu.Item> <div onClick={this.handleLoginOut}>退出</div> </Menu.Item> </Menu> ); return ( <Layout style={{ minHeight: '100vh' }}> <Sider collapsible collapsed={this.state.collapsed} onCollapse={this.onCollapse}> <div className="logo"> CRM </div> <Menu theme="dark" defaultSelectedKeys={['person']} defaultOpenKeys={['table']} mode="inline"> <SubMenu key="person" title={ <span> <Icon type="user" /> <span>個(gè)人客戶</span> </span> } > <Menu.Item key="table"><Link to={'/main/client/table'}>個(gè)人客戶表</Link></Menu.Item> <Menu.Item key="new"><Link to={'/main/client/new'}>添加個(gè)人客戶</Link></Menu.Item> </SubMenu> <SubMenu key="firms" title={ <span> <Icon type="team" /> <span>企業(yè)客戶</span> </span> } > <Menu.Item key="table"><Link to={'/main/firms/table'}>企業(yè)客戶表</Link></Menu.Item> <Menu.Item key="new"><Link to={'/main/firms/new'}>添加企業(yè)客戶</Link></Menu.Item> </SubMenu> <SubMenu key="account" title={ <span> <Icon type="area-chart" /> <span>績(jī)效匯總</span> </span> } > <Menu.Item key="table"><Link to={'/main/account/table'}>績(jī)效匯總表</Link></Menu.Item> <Menu.Item key="new"><Link to={'/main/account/new'}>添加新成交</Link></Menu.Item> </SubMenu> </Menu> </Sider> <Layout> <Header> <Dropdown overlay={menu}> <Avatar style={{ backgroundColor: '#f56a00', verticalAlign: 'middle' }} size="large"> {this.state.user} </Avatar> </Dropdown> </Header> <Content style={{ margin: '0 16px' }}> <ContentMain /> </Content> <Footer style={{ textAlign: 'center' }}>Ant Design ?2018 Created by Ant UED</Footer> </Layout> </Layout> ); } }
contentMain組件
import React from 'react'; import {HashRouter as Router,Route, Switch} from 'react-router-dom'; import ClientsTable from './clients/table'; import ClientsNew from './clients/new'; import FirmsTable from './firms/table'; import FirmsNew from './firms/new'; import AccountTable from './account/table'; import AccountNew from './account/new'; import Personal from './personal'; class ContentMain extends React.Component { render() { return ( <div> <Router> <Switch> <Route exact path='/main/client/table' component={ClientsTable}/> //全部都精確匹配 <Route exact path='/main/client/new' component={ClientsNew}/> <Route exact path='/main/firms/table' component={FirmsTable}/> <Route exact path='/main/firms/new' component={FirmsNew}/> <Route exact path='/main/account/table' component={AccountTable}/> <Route exact path='/main/account/new' component={AccountNew}/> <Route exact path='/main/personal' component={Personal}/> </Switch> </Router> </div> ) } } export default ContentMain
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React報(bào)錯(cuò)信息之Expected?an?assignment?or?function?call?and?
這篇文章主要介紹了React報(bào)錯(cuò)之Expected?an?assignment?or?function?call?and?instead?saw?an?expression,下面有兩個(gè)示例來(lái)展示錯(cuò)誤是如何產(chǎn)生的,需要的朋友可以參考下2022-08-08react系列從零開(kāi)始_簡(jiǎn)單談?wù)剅eact
下面小編就為大家?guī)?lái)一篇react系列從零開(kāi)始_簡(jiǎn)單談?wù)剅eact。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07react-redux action傳參及多個(gè)state處理的實(shí)現(xiàn)
本文主要介紹了react-redux action傳參及多個(gè)state處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳解react中的state的簡(jiǎn)寫(xiě)方式
React是一個(gè)狀態(tài)機(jī)主要體現(xiàn)在state上,通過(guò)與用戶交易實(shí)現(xiàn)不同的狀態(tài),state是組件的私有屬性,是用來(lái)初始化的,本文重點(diǎn)給大家介紹react中的state的簡(jiǎn)寫(xiě)方式,感興趣的朋友一起看看吧2021-08-08詳解關(guān)于React-Router4.0跳轉(zhuǎn)不置頂解決方案
這篇文章主要介紹了詳解關(guān)于React-Router4.0跳轉(zhuǎn)不置頂解決案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05react實(shí)現(xiàn)頁(yè)面水印效果的全過(guò)程
大家常常關(guān)注的是網(wǎng)站圖片增加水印,而很少關(guān)注頁(yè)面水印,其實(shí)這個(gè)需求也是比較常見(jiàn)的,比如公文系統(tǒng)、合同系統(tǒng)等,這篇文章主要給大家介紹了關(guān)于react實(shí)現(xiàn)頁(yè)面水印效果的相關(guān)資料,需要的朋友可以參考下2021-09-09React源碼分析之useCallback與useMemo及useContext詳解
這篇文章主要介紹了React useCallback與useMemo及useContext源碼分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11