react antd后臺(tái)管理系統(tǒng)路由扇商、導(dǎo)航設(shè)計(jì)

作為主流框架,本人比較喜歡react風(fēng)格宿礁,引入導(dǎo)入可能多些代碼案铺,相比Vue更為完整

選擇antd作為web后臺(tái)管理系統(tǒng)框架,其一是ant的UI好看窘拯,其二組件完善

不論是新手還是老手都比較愿意去使用ant红且,彩蛋事件忽略

本文主要是講react框架上后臺(tái)管理系統(tǒng)路由設(shè)計(jì),ant并非項(xiàng)目必須

主要使用react-router-dom 4.0模塊涤姊,

  • 實(shí)現(xiàn)一套路由配置同時(shí)兼容路由和導(dǎo)航條的渲染暇番,其中借鑒了Vue Router的config的寫法
  • 實(shí)現(xiàn)登錄驗(yàn)證
  • 用戶管理權(quán)限部分

/* 使用Mobx作為狀態(tài)管理 */

作為本人設(shè)計(jì)筆記,也供在線點(diǎn)評(píng)

嵌套路由

例:
這里有一個(gè)后臺(tái)管理系統(tǒng)思喊,通常這套系統(tǒng)會(huì)有主頁壁酬、用戶管理兩個(gè)頁面,用戶管理里面會(huì)有用戶詳情,修改編輯這類
那么我們會(huì)定義用戶管理頁面的path:/user舆乔,用戶詳情/user/detail岳服,單個(gè)用戶的情況下/user/detail/:id,這樣的寫法希俩。
當(dāng)我們用戶詳情下面再有什么單獨(dú)頁面顯示吊宋,那么就會(huì)出現(xiàn)/user/detail/:id/**這類,那么這種就需要嵌套路由

使用react-router-dom完成嵌套路由,具體寫法

<Switch>
      <Route path="/index" />
        <Route path="/user">
              
                <Switch>
                        <Route path="/user/detail/:id" component={ /*子路由組件 */ }></Route>
                        /* 希望路由只針對(duì)某個(gè)用戶颜武,而非針對(duì)用戶的訪問情況璃搜,需要跳轉(zhuǎn)到相應(yīng)上級(jí)頁面 */
                        <Route render={ () => <Redirect to="/user" /> } />
                </Switch>
        </Route>
</Switch>

以上即為路由的嵌套寫法

導(dǎo)航部分:

image.png

如這樣,用戶管理鳞上,下面有其他項(xiàng)这吻,經(jīng)過分析,路由與導(dǎo)航是可以統(tǒng)一配置的

那么為了統(tǒng)一篙议,方便配置(少量代碼唾糯,做更多有趣的事),我們會(huì)定義一個(gè)json鬼贱,同時(shí)去處理路由與nav

簡(jiǎn)單定義一個(gè)RouterConfig.js文件移怯,
export default [
  {
    path : '/home',    //  一級(jí)路由path
    meta : '主頁',     //  導(dǎo)航名稱
    icon : '',      //  所用icon
    role : [],    //  適用權(quán)限
    // 所用組件 
    component : sync(() => import( /* webpackChunkName: 'home' */ '@/Pages/Home/index.js')),
    children : [  //二級(jí)路由
        {
              path : '/one',  //二級(jí)路由path ,react將會(huì)渲染為/home/one
              meta : '嵌套1',
              icon : '',
              role : [],
              component : sync(() => import ( /* webpackChunkName: 'home_page_one' */ '@/Pages/Home/one')), 
              children : []
        },
        {
              path : '/two',
              meta : '嵌套2',
              icon : '',
              role : [],
              component : sync(() => import ( /* webpackChunkName: 'home_page_one' */ '@/Pages/Home/two')), 
              children : [],
          },
      ],
  },
  {
            path : '/user',
            meta : '用戶',
            icon : '',
            role : [],
            component : sync(() => import( /* webpackChunkName: 'user' */ '@/Pages/User/index.js')),
            children : [
                    {
                        path : '/one',
                        meta : '嵌套1',
                        icon : '',
                        role : [],
                        component : sync(() => import ( /* webpackChunkName: 'user_page_one' */ '@/Pages/User/one')), 
                        children : [],
                    },
                    {
                          path : '/two',
                          meta : '嵌套2',
                          icon : '',
                          role : [],
                          component : sync(() => import ( /* webpackChunkName: 'user_page_two' */ '@/Pages/User/two')),
                          children : [], 
                      },
              ]
        }

]

是不是更像是一個(gè)Vue Router 配置呢

直面React-router-dom 路由全部配置
import RouterConfig from 'RouterConfig.js'

class RouterComponent extends React.component {
render () {
        return (
            <Switch>
                {
                    RouterConfig.map(
                        router => {
                            return (
                                <Route
                                    path={ router.path }
                                    key={ router.path }
                                    component={
                                        props => {
                                            return (
                                                <RouteComponent 
                                                    router={ router } 
                                                    { ...props } 
                                                />
                                            )
                                        }
                                    }
                                />
                            )
                        }
                    )
                }
            </Switch>
        )
    }
}
一級(jí)路由
export const RouteComponent = props => {
    return (
        <Switch>
            {
                props.router.children.map (
                    router => {
                        return (
                            <Route
                                path={ props.match.url + router.path }
                                key={ router.path }
                                { ...props }
                                component={
                                    npx => {
                                        return (
                                            <RouteChildrenComponent 
                                                router={ router }
                                                { ...npx }
                                            />
                                        )
                                    }
                                }
                            />
                        )
                    }
                )
            }
            {
                <Route 
                    component={ 
                        () => {
                            return <Container { ...props } component={ props.router.component } />
                        } 
                    } 
                /> 
            }
        </Switch>
    )
}
子路由
export const RouteChildrenComponent = props => {
    return (
        <Switch>
            {
                props.router.children.map(
                    npx => {
                        return (
                            <Route
                                path={ npx.path ? props.match.url + npx.path : '' }
                                key={ npx.meta }
                                component={
                                    props => {
                                        return (
                                            <Container { ...props } component={ npx.component } />
                                        )
                                    }
                                }
                            />
                        )
                    }
                )
            }
            {
                props.router.component ? 
                (
                    <Route 
                        render={ 
                            () => {
                                return (
                                    <Container { ...props } component={ props.router.component } /> 
                                )
                            }
                        }
                    />
                ) 
                : <Route render={ () => <Redirect to='/login' /> } />
            }
        </Switch>
    )
}
渲染導(dǎo)航

class MenuComponent extends React.Component {

    render () {
        let collapsed = this.props.store.collapsed
        let store = this.props.store;

        const defaultOpenKeys = router.map( item => item.path )

        return (
            <Menu 
                defaultSelectedKeys={ [ this.props.location.pathname ] }
                theme="dark" 
                defaultOpenKeys={ defaultOpenKeys }
                mode="inline" 
                inlineCollapsed={ collapsed }
            >
                {
                    router.map(
                        npx => {
                            return (
                                <SubMenu 
                                    key={ npx.path } 
                                    title={
                                        <span>
                                            <Icon type={ npx.icon ? npx.icon : 'user' } />
                                            <span>{ npx.meta }</span>
                                        </span>
                                    }
                                >
                                    {
                                       /*這里并未做權(quán)限驗(yàn)證吩愧,只是做了個(gè)基本的應(yīng)用*/
                                        npx.role === '' || store[npx.role] ? 
                                        <MenuItem
                                            key={ npx.path }
                                            onClick = {
                                                () => this.props.history.push( npx.path )
                                            }
                                        >
                                            { npx.meta }
                                        </MenuItem> : ''
                                    }
                                    { 
                                        npx.children.map( 
                                            item => {
                                            /*這里并未做權(quán)限驗(yàn)證芋酌,只是做了個(gè)基本的應(yīng)用*/
                                                return (
                                                    store[ item.role ] || item.role === '' ? (
                                                        <Menu.Item 
                                                            key={ npx.path + item.path } 
                                                            onClick={ 
                                                                () => this.props.history.push( npx.path + item.path ) 
                                                            }
                                                        >
                                                            { item.meta }
                                                        </Menu.Item> 
                                                    ) : ''
                                                )
                                            }
                                        )
                                    }
                                    
                                </SubMenu>
                            )
                        }
                    )
                }
            </Menu>
        )
    }
}

一個(gè)Vue 路由配置拿到React的小例子,寫好配置就是做好渲染就可以啦雁佳,so,是需要去看代碼的同云。

git:
https://github.com/wulibaibao/react-antd-demo
個(gè)人博客:
https://www.wulibaibao.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糖权,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炸站,更是在濱河造成了極大的恐慌星澳,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旱易,死亡現(xiàn)場(chǎng)離奇詭異禁偎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阀坏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門如暖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忌堂,你說我怎么就攤上這事盒至。” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵枷遂,是天一觀的道長(zhǎng)樱衷。 經(jīng)常有香客問我,道長(zhǎng)酒唉,這世上最難降的妖魔是什么矩桂? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮痪伦,結(jié)果婚禮上耍鬓,老公的妹妹穿的比我還像新娘。我一直安慰自己流妻,他們只是感情好牲蜀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绅这,像睡著了一般涣达。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上证薇,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天度苔,我揣著相機(jī)與錄音,去河邊找鬼浑度。 笑死寇窑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箩张。 我是一名探鬼主播甩骏,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼先慷!你這毒婦竟也來了饮笛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤论熙,失蹤者是張志新(化名)和其女友劉穎福青,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脓诡,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡无午,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祝谚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宪迟。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踊跟,靈堂內(nèi)的尸體忽然破棺而出踩验,到底是詐尸還是另有隱情鸥诽,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布箕憾,位于F島的核電站牡借,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袭异。R本人自食惡果不足惜钠龙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望御铃。 院中可真熱鬧碴里,春花似錦、人聲如沸上真。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睡互。三九已至根竿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間就珠,已是汗流浹背寇壳。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妻怎,地道東北人壳炎。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逼侦,于是被迫代替她去往敵國和親匿辩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 我姓付偿洁,常有人說撒汉,這姓不好,以后做了正職涕滋,按常規(guī)叫法,聽起來依然是副職挠阁。每每被人介紹宾肺,多數(shù)人都還要解釋一番。我卻滿...
    飛常心閱讀 622評(píng)論 1 3
  • 跑步的酣暢是不跑步的人永遠(yuǎn)也體會(huì)不到的侵俗。假如你現(xiàn)在正抱著可樂锨用,吃著薯片吹著空調(diào)玩手機(jī),讓你出去走上一圈隘谣,則如經(jīng)歷煉...
    家有喵星人1閱讀 399評(píng)論 0 0
  • 家庭有廣義和狹義之分:狹義是指一夫一妻制構(gòu)成的社會(huì)單元增拥;廣義的則泛指人類進(jìn)化的不同階段上的各種家庭利益集團(tuán)即家族啄巧。...
    雷哥說閱讀 409評(píng)論 4 6
  • 伴著日文《大丈夫》的歌聲秩仆,我在鍵盤上敲下了今天推文的第一句話。 剛剛看完朋友小王在自己公眾號(hào)上發(fā)表的“停更告別信”...
    弓水吉閱讀 586評(píng)論 4 6