目录

React基础之ReactRouter

目录

React基础之ReactRouter

一个路径path对于一个组件component,当我们在浏览器中访问一个path的时候,path对于的组件会在页面中渲染

npm i react-router-dom

抽象路由模块

https://i-blog.csdnimg.cn/direct/b5616e8d7be54f45a24cad996f59fe19.png

在src下创建一个router目录,创建一个index.js入口文件

import

Login

from

“../page/Login”

;

import

Article

from

“../page/Article”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

const

router

=

createBrowserRouter

([

{

path:

‘/login’

,

element:

<

Login

/>

},

{

path:

‘/article’

,

element:

<

Article

/>

}

])

export default

router

page下创建不同的组件文件夹

Article下的index.js与Login下的index.js差不多

const

Login

=()

=>

{

return

<

div

我是登录页

</

div

}

export default

Login

然后再src下的index.js入口文件中,使用该路由

import

React

from

‘react’

;

import

ReactDOM

from

‘react-dom/client’

;

import

‘./index.css’

;

import

reportWebVitals

from

‘./reportWebVitals’

;

import

{

RouterProvider

}

from

‘react-router-dom’

;

//导入路由组件

import router from ’./router’ ;

const

root

=

ReactDOM

.

createRoot

(

document

.

getElementById

(

‘root’

));

root

.

render

(

< React.StrictMode >

< RouterProvider router = { router } ></ RouterProvider >

</ React.StrictMode >

);

reportWebVitals

();


路由导航

由一个组件跳转到另外一个组件

1.声明式导航

import

{

Link

}

from

“react-router-dom”

const

Login

=()

=>

{

return

(

<

div

我是登录页

< Link to = "/article" > 跳转到文章页 </ Link >

</

div

)

}

export default

Login

https://i-blog.csdnimg.cn/direct/3d9297d1d7714a8d8be0e6e251cb4890.png

2.编程式导航

调用useNavigate钩子得到导航方法,通过调用方法以命令式的形式进行路由跳转

import

{

useNavigate

}

from

“react-router-dom”

const

Login

=()

=>

{

const

navigate

=

useNavigate

()

return

(

<

div

我是登录页

<

button

onClick

=

{

()

=>

navigate

(

‘/article’

)

}

跳转到文章页

</

button

</

div

)

}

export default

Login

https://i-blog.csdnimg.cn/direct/2090a03d1d614aadbbdf835f36d681a0.png


路由传参

方法1.saerchParams传参

传入参数

import

{

useNavigate

}

from

“react-router-dom”

const

Login

=()

=>

{

const

navigate

=

useNavigate

()

return

(

<

div

我是登录页

<

button

onClick

=

{

()

=>

navigate

(

‘/article’

)

}

跳转到文章页

</

button

< button onClick = { () => navigate ( ’/article?id=1001&name=jack’ ) } > searchParams 传参 </ button >

</

div

)

}

export default

Login

接收参数

import

{

useSearchParams

}

from

“react-router-dom”

const

Article

=()

=>

{

const [ params ]= useSearchParams ()

const id = params . get ( ‘id’ )

const name = params . get ( ’name’ )

return

<

div

我是文章页

,

{

id

}

,

{

name

}

</

div

}

export default

Article

方法2 params传参

注意:需要在路由配置中设置对应的参数映射

传入参数

import

{

useNavigate

}

from

“react-router-dom”

const

Login

=()

=>

{

const

navigate

=

useNavigate

()

return

(

<

div

我是登录页

<

button

onClick

=

{

()

=>

navigate

(

‘/article’

)

}

跳转到文章页

</

button

< button onClick = { () => navigate ( ’/article/1001/jack’ ) } > params 传参 </ button >

</

div

)

}

export default

Login

路由中配置映射

import

Login

from

“../page/Login”

;

import

Article

from

“../page/Article”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

const

router

=

createBrowserRouter

([

{

path:

‘/login’

,

element:

<

Login

/>

},

{

path:

‘/article/:id/:name’

,

element:

<

Article

/>

}

])

export default

router

接收参数

import

{

useParams

,

useSearchParams

}

from

“react-router-dom”

const

Article

=()

=>

{

const params = useParams ()

const id = params . id

const name = params . name

return < div > 我是文章页 , { id } , { name } </ div >

}

export default

Article

https://i-blog.csdnimg.cn/direct/29bf2a8b5c61434d82fa270752ed1cb4.png


路由嵌套

1.在路由配置中配置配置一级路由与它的Children

https://i-blog.csdnimg.cn/direct/295f4459f07842dd8d0148ad3964aeea.png

import

Login

from

“../page/Login”

;

import

Article

from

“../page/Article”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

import

Layout

from

“../page/Layout”

;

import

Board

from

“../page/Board”

;

import

About

from

“../page/About”

;

const

router

=

createBrowserRouter

([

{

path: ’/’ ,

element: < Layout /> ,

children: [

{

path: ‘board’ ,

element: < Board />

},

{

path: ‘about’ ,

element: < About />

}

]

},

])

export default

router

https://i-blog.csdnimg.cn/direct/b8ce4894d71d4c549c4f1286fb5b1ff9.png

2.在一级路由处,配置二级路由出口

import

{

Link

,

Outlet

}

from

“react-router-dom”

const

Layout

=()

=>

{

return

(

<

div

我是一级路由Layout

<

Link

to

=

“/board”

面板

</

Link

<

Link

to

=

“about”

关于

</

Link

{

/*

配置二级路由出口

*/

}

<

Outlet

/>

</

div

)

}

export default

Layout

https://i-blog.csdnimg.cn/direct/ada846adf25d49a8a0a63e5b0d04c2ff.png


默认二级路由配置

也就是已进入到这个一级路由,就会显示这个二级路由的渲染,但是路径不发生变化

index的路由配置为

import

Login

from

“../page/Login”

;

import

Article

from

“../page/Article”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

import

Layout

from

“../page/Layout”

;

import

Board

from

“../page/Board”

;

import

About

from

“../page/About”

;

const

router

=

createBrowserRouter

([

{

path:

‘/’

,

element:

<

Layout

/>

,

children:

[

{

//

默认二级路由设置

index: true ,

element:

<

Board

/>

},

{

path:

‘about’

,

element:

<

About

/>

}

]

}])

export default

router

https://i-blog.csdnimg.cn/direct/d23fe54c79574d5aaceaadf2a8070ffc.png

一级路由Layout为

import

{

Link

,

Outlet

}

from

“react-router-dom”

const

Layout

=()

=>

{

return

(

<

div

我是一级路由Layout

< Link to = "/" > 面板 </ Link >

<

Link

to

=

“about”

关于

</

Link

{

/*

配置二级路由出口

*/

}

<

Outlet

/>

</

div

)

}

export default

Layout


404 路由配置

浏览器中的url路径在整个路由配置中找不到,我们就可以配置404兜底路由

1.设置一个NotFound组件

const

NotFount

=()

=>

{

return

(

<

div

页面消失了

</

div

)

}

export default

NotFount

2.在路由配置中添加path为*的路由配置项

import

Login

from

“../page/Login”

;

import

Article

from

“../page/Article”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

import

NotFount

from

“../page/NotFound”

;

const

router

=

createBrowserRouter

([

{

path:

‘*’

,

element:

<

NotFount

/>

}

])

export default

router

https://i-blog.csdnimg.cn/direct/3f62b278d4864ceba0bb50e1d42420b9.png


两种路由模式

也有history与hash两种模式

https://i-blog.csdnimg.cn/direct/b06416179ebc42e6adaeaa8235f94691.png

只需要将之前使用的 createBrowserRouter 修改成

createHashRouter

import

Login

from

“../page/Login”

;

import

Article

from

“../page/Article”

;

import

{

createBrowserRouter

,

createHashRouter

}

from

“react-router-dom”

;

import

Layout

from

“../page/Layout”

;

import

Board

from

“../page/Board”

;

import

About

from

“../page/About”

;

import

NotFount

from

“../page/NotFound”

;

const

router

= createHashRouter

([

{

path:

‘/’

,

element:

<

Layout

/>

,

children:

[

{

//

默认二级路由设置

index:

true

,

element:

<

Board

/>

},

{

path:

‘about’

,

element:

<

About

/>

}

]

},

{

path:

‘/login’

,

element:

<

Login

/>

},

{

path:

‘/article/:id/:name’

,

element:

<

Article

/>

},

{

path:

‘*’

,

element:

<

NotFount

/>

}

])

export default

router

https://i-blog.csdnimg.cn/direct/52127a548cea481b99373fccef506dd4.png