reactJs+react Router多級導(dǎo)航切換路由(頁面)

上次寫了vue+Vue Router多級導(dǎo)航切換路由(頁面)威彰,發(fā)現(xiàn)還有人看出牧,這次就寫一個reactJs版的切換路由。

還是秉承著能公用歇盼,不重復(fù)的思路舔痕,將側(cè)導(dǎo)航做成公共組件。將導(dǎo)航做成父頁面組件豹缀,將切換的頁面做成子頁面伯复,這樣只需調(diào)用一次即可。大大減少了后期維護的麻煩

涉及功能點

  • 導(dǎo)航支持多級
  • reactJs Router
  • 子父組件的寫法
  • 樣式:ant.designUI
  • Loadable路由懶加載

效果圖

01-10-14_27_46.gif

目錄結(jié)構(gòu)

TIM截圖20190110143836.png
  • app.js是主頁面
  • main.js是我進行一些模塊耿眉,變量全局處理的文件
  • router下的config.js是路由統(tǒng)一管理的地方
  • Menu下的index是導(dǎo)航組件
  • contentMain是渲染切換頁面的地方

reactJs Router的安裝與使用

安裝npm install --save react-router-dom
引入import {BrowserRouter} from 'react-router-dom';

本文還用到了路由懶加載
npm install --save react-loadable

上代碼边翼!

---app.js

import React, {Component} from 'react';
//全局文件
import './main';
//路由
import {BrowserRouter} from 'react-router-dom';

//布局組件
import CustomMenu from "./components/Menu/index";//導(dǎo)航
import ContentMain from './components/ContentMain'//主題

//UI-antd-按需引入
import 'antd/dist/antd.css';
import {Layout } from 'antd';

const {
    Sider, Content,
} = Layout;

let screenHeight= window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;

class App extends Component {
    render() {
        return (
            <div className="App" >
                <BrowserRouter>
                    <Layout>
                        <Sider className="App-customMenu" style={{height:screenHeight}}>
                            <CustomMenu/>
                        </Sider>
                        <Layout>
                            {/*<Header>Header</Header>*/}
                            <Content className="App-contentMain" style={{height:screenHeight}}>
                                <ContentMain/>
                            </Content>
                            {/*<Footer>Footer</Footer>*/}
                        </Layout>
                    </Layout>
                </BrowserRouter>
            </div>
        );
    }
}
export default App;

導(dǎo)航組件menu

注意
global.menus是導(dǎo)航的菜單數(shù)據(jù)鱼响,我這里定義的是全局變量鸣剪,實際項目時也可以是后臺接口請求過來的。

global.menus = [
    {
        title: '首頁',
        icon: 'page',
        key: '/'
    },   {
        title: '其它',
        icon: 'bulb',
        key: '/page/Other',
        subs: [
            {key: '/page/AlertDemo', title: '彈出框', icon: ''},
        ]
     },
]

renderSubMenu是處理子菜單的方法丈积。renderMenuItem是最子級菜單的路由渲染方法筐骇。
Menu是antdUI的組件,其他形式可去其官網(wǎng)了解

import React from 'react'
import {Link} from 'react-router-dom';
import {Menu, Icon} from 'antd';
const menus =global.menus;
//此組件的意義就是將數(shù)據(jù)抽離出來江滨,通過傳遞數(shù)據(jù)去渲染
class CustomMenu extends React.Component {

    renderSubMenu = ({key, icon, title, subs}) => {
        return (
            <Menu.SubMenu key={key} title={<span>{icon && <Icon type={icon}/>}<span>{title}</span></span>}>
                {
                    subs && subs.map(item => {
                        return item.subs && item.subs.length > 0 ? this.renderSubMenu(item) : this.renderMenuItem(item)
                    })
                }
            </Menu.SubMenu>
        )
    }
    renderMenuItem = ({key, icon, title,}) => {
        return (
            <Menu.Item key={key}>
                <Link to={key}>
                    {icon && <Icon type={icon}/>}
                    <span>{title}</span>
                </Link>
            </Menu.Item>
        )
    }
    render() {
        return (
                <Menu
                defaultSelectedKeys={['1']}
                defaultOpenKeys={['sub1']}
                mode="inline"
            >
                {
                    menus.map(item => {
                        return item.subs && item.subs.length > 0 ? this.renderSubMenu(item) : this.renderMenuItem(item)
                    })
                }
            </Menu>
        )
    }
}
export default CustomMenu

---主體渲染組件-CustomMenu

注意
path里的路徑铛纬,要和你的菜單路徑保持一致,這樣才能匹配渲染

import React from 'react'
//引入路由
import {Route, Switch} from 'react-router-dom'

class ContentMain extends React.Component {
    render() {
        return (
            <div>
                <Switch>
                    <Route exact path='/' component={global.Main}/>
                    <Route exact path='/page/general/fromDemo' component={global.FromDemo}/>
                    <Route exact path='/page/AlertDemo' component={global.Alert}/>
                    <Route exact path='/page/TableDemo' component={global.Table}/>
                    <Route exact path='/page/HttpDemo' component={global.HttpDemo}/>
                    <Route exact path='/page/TreeDemo' component={global.TreeDemo}/>

                </Switch>
            </div>
        )
    }
}

export default ContentMain

---路由管理文件

具體路徑你自己來定唬滑,我這里只做展示

Loading也是個組件是展示加載效果的告唆。

//Loadable插件需使用Loading
import Loadable from 'react-loadable'
import Loading from '../components/Loading/index';

//定義路由
global.Main = Loadable({
    loader: () => import('../page/index'),
    loading: Loading,
});
//表單

當當當 到此就整個導(dǎo)航切換的就完成了,有哪里不明白可以留言晶密,如果幫助到你擒悬,就點個贊收個藏吧~~~ 嘻嘻嘻。

有更好的寫法歡迎交流討論~~

github上有完整代碼稻艰,有幫助請給星星喲~
https://github.com/zccone/reactRouterDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂牧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尊勿,更是在濱河造成了極大的恐慌僧凤,老刑警劉巖畜侦,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異躯保,居然都是意外死亡旋膳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門途事,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溺忧,“玉大人,你說我怎么就攤上這事盯孙÷成” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵振惰,是天一觀的道長歌溉。 經(jīng)常有香客問我,道長骑晶,這世上最難降的妖魔是什么痛垛? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮桶蛔,結(jié)果婚禮上匙头,老公的妹妹穿的比我還像新娘。我一直安慰自己仔雷,他們只是感情好蹂析,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碟婆,像睡著了一般电抚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竖共,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天蝙叛,我揣著相機與錄音,去河邊找鬼公给。 笑死借帘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的淌铐。 我是一名探鬼主播肺然,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匣沼!你這毒婦竟也來了狰挡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎加叁,沒想到半個月后倦沧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡它匕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年展融,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豫柬。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡告希,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烧给,到底是詐尸還是另有隱情燕偶,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布础嫡,位于F島的核電站指么,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏榴鼎。R本人自食惡果不足惜伯诬,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巫财。 院中可真熱鬧盗似,春花似錦、人聲如沸平项。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葵礼。三九已至号阿,卻和暖如春并鸵,著一層夾襖步出監(jiān)牢的瞬間鸳粉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工园担, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留届谈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓弯汰,卻偏偏與公主長得像艰山,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咏闪,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 當當當當當~我又來了曙搬。 在項目里經(jīng)常會遇到側(cè)導(dǎo)航切換頁面的功能。 如果我們將側(cè)導(dǎo)航做成公共組件,來調(diào)用的話纵装,就會在...
    張一井閱讀 24,604評論 3 24
  • vue-router 基本使用 路由征讲,其實就是指向的意思,當我點擊頁面上的home按鈕時橡娄,頁面中就要顯示home的...
    Jony0114閱讀 1,241評論 0 0
  • 我不知我何時來到了這里诗箍,眼前的一切都讓我驚喜,藍藍的天挽唉,白白的云滤祖,周圍一望無際的碧綠草地,難道這就是所謂的大草原瓶籽,...
    簫君閱讀 320評論 0 1
  • 現(xiàn)實 昨日夜里做了一個奇怪夢匠童。夢見浮世繁華,我卻在一個渾濁的角落靜默地走進這片土地塑顺。這片土地的東方俏让,有太陽、繁星茬暇、...
    闌塵閱讀 283評論 2 3
  • 今天是元宵節(jié)首昔,晚上去南京夫子廟逛了一下,人山人海的擠不進去糙俗,還忘記帶現(xiàn)金導(dǎo)致買不了燈會的門票····于是就早早的回...
    夢里凄惶閱讀 338評論 0 0