React-Router 嵌套路由(路由嵌套路由)

目前使用的版本

"react-router-dom": "^5.1.2",
示例圖1
示例圖2

先定義頁面

Topic.js, About.js, Topic.js, A.js, B.js (將里面的文字做相應的替換)

import React from 'react'

export default class Topic extends React.Component {
    render() {
        return (
            <>
                <div>
                    Topic頁面
                </div>
            </>
        )
    }
}

Home2.js

import React from 'react'
import { Link } from 'react-router-dom'

export default class Home extends React.Component {
    render() {
        return (
                <div>
                    <ul>
                        <li>
                            <Link to="/">Home2</Link>
                        </li>
                        <li>
                            <Link to="/about">About2</Link>
                        </li>
                        <li>
                            <Link to="/topic">Topics2</Link>
                        </li>
                    </ul>

                    <hr/>
                    {/* 子頁面 */}
                    {/* 所有子組件 */}
                    {this.props.children}
                </div>
        )
    }
}

router.js

import React from 'react'
import { HashRouter as Router, Route, Link, Switch, useRouteMatch, useParams } from 'react-router-dom'

import Main from './Main'
import About from './About'
import Topic from './Topic'

import Home from './Home'
import A from './A'
import B from './B'

/**
 * 這個頁面就是 最終輸出頁面
 * 在項目根目錄的 index.js 文件里面
 * 
 * import Router from './pages/router_demo/router02/router';
 * ReactDOM.render(<Router />, document.getElementById('root'));
 */
export default class IRouter extends React.Component {

    render() {
        return (
            <>
                <Router>
                    {/* 只能有一個根節(jié)點 */}
                    <Home>
                        {/* 頁面路由,一個 Route 代表一個頁面 */}
                        {/* 4.0  版本開始允許加載多個路由咏闪,所以建議加上 exact 進行精準匹配*/}
                        <Route exact={true} path="/" component={Main}/>
                        <Route exact={true} path="/about" component={About}/>
                        <Route exact={true} path="/topic" component={Topic}/>
                        {/* 嵌套路由秕衙,不能在父級家 exact完丽,因為先要匹配父級然后才能匹配子集 */}
                        {/* 比如:/nested/a , 會先匹配父級 /nested 飯后才能匹配 /nested/a */}
                        <Route path="/nested" component={() => <Nested />} />
                    </Home>
                </Router>
            </>
        )
    }
}

/**
 * 函數組件
 * @param {*} props 
 */
export function Nested(props) {
    // 獲取route的匹配數據
    // path 路徑, url 路徑, params 參數
    const { path, url, params } = useRouteMatch()
    // 獲取 path 參數, http://localhost:3000/a/:number
    // const { number } = useParams()

    console.log(path, url, params)
    return (
        <>
            <ul>
                <li>
                    <Link to={`${path}/a`}>A頁面</Link>
                </li>
                <li>
                    <Link to={`${path}/b`}>B頁面</Link>
                </li>
            </ul>
            <hr/>
            {/* {props.children} */}
            <Switch>
                <Route exact path={path} component={() => <h3>嵌套路由</h3>}/>
                <Route  path={`${path}/a`} component={A}/>
                <Route  path={`${path}/b`} component={B}/>
            </Switch>
        </>
    )
}

嵌套路由的重點在于烤送,嵌套路由歼指,不能在父級加 exact(精準匹配),因為先要匹配 父級 然后才能匹配 子集
比如:/nested/a 评姨, 會先匹配父級 /nested 后才能匹配 /nested/a

<Route path="/nested" component={() => <Nested />} />
.......  分隔符 ...........

// <Nested /> 組件的內部
// 這里的 path 就是 /nested
// `${path}/a` 就是 /nested/a
<Switch>
     <Route exact path={path} component={() => <h3>嵌套路由</h3>}/>
     <Route  path={`${path}/a`} component={A}/>
     <Route  path={`${path}/b`} component={B}/>
</Switch>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末难述,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子吐句,更是在濱河造成了極大的恐慌胁后,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗦枢,死亡現場離奇詭異攀芯,居然都是意外死亡,警方通過查閱死者的電腦和手機文虏,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門侣诺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氧秘,你說我怎么就攤上這事年鸳。” “怎么了丸相?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵搔确,是天一觀的道長。 經常有香客問我灭忠,道長妥箕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任更舞,我火速辦了婚禮畦幢,結果婚禮上,老公的妹妹穿的比我還像新娘缆蝉。我一直安慰自己宇葱,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布刊头。 她就那樣靜靜地躺著黍瞧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪原杂。 梳的紋絲不亂的頭發(fā)上印颤,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音穿肄,去河邊找鬼年局。 笑死际看,一個胖子當著我的面吹牛,可吹牛的內容都是我干的矢否。 我是一名探鬼主播仲闽,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼僵朗!你這毒婦竟也來了赖欣?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤验庙,失蹤者是張志新(化名)和其女友劉穎顶吮,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體粪薛,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悴了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了汗菜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡挑社,死狀恐怖陨界,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情痛阻,我是刑警寧澤菌瘪,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站阱当,受9級特大地震影響俏扩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜弊添,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一录淡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧油坝,春花似錦嫉戚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞬女,卻和暖如春窍帝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诽偷。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工坤学, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疯坤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓拥峦,卻偏偏與公主長得像贴膘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子略号,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容