第九章 React Router 6
三、总结
1. Component
1.1
import React from "react" ;
import ReactDOM from "react-dom" ;
import { BrowserRouter } from "react-router-dom" ;
ReactDOM. render (
< BrowserRouter>
{ }
< / BrowserRouter> , root
) ;
1.2
说明:作用与 一样,但 修改的是地址栏的 hash 值。 备注:6.x 版本中 、 的用法与 5.x 相同。
1.3 与
v6 版本中移出了先前的 ,引入了新的替代者: 。 和 要配合使用,且必须要用 包裹 。 相当于一个 if 语句,如果其路径与当前 URL 匹配,则呈现其对应的组件。 属性用于指定:匹配时是否区分大小写(默认为 false)。当 URL 发生变化时, 都会查看其所有子 元素以找到最佳匹配并呈现组件 。 也可以嵌套使用,且可配合 useRoutes()配置 “路由表” ,但需要通过 组件来渲染其子路由。示例代码:
< Routes>
< Route path= "/login" element= { < Login / > } > < / Route>
< Route path= "home" element= { < Home / > } >
< Route path= "test1" element= { < Test/ > } > < / Route>
< Route path= "test2" element= { < Test2/ > } > < / Route>
< / Route>
< Route path= "users" >
< Route path= "xxx" element= { < Demo / > } / >
< / Route>
< / Routes>
1.4
作用: 修改 URL,且不发送网络请求(路由链接)。 注意: 外侧需要用 或 包裹。 示例代码:
import { Link } from "react-router-dom" ;
function Test ( ) {
return (
< div>
< Link to= "/路径" > 按钮< / Link>
< / div>
) ;
}
1.5
作用: 与 组件类似,且可实现导航的“高亮”效果。 示例代码:
< NavLink
to= "login"
className= { ( { isActive } ) => {
console. log ( 'home' , isActive)
return isActive ? 'base one' : 'base'
} }
> login< / NavLink>
< NavLink to= "home" end > home< / NavLink>
1.6
作用:只要 组件被渲染,就会修改路径,切换视图。 replace 属性用于控制跳转模式(push 或 replace,默认是 push)。 示例代码:
import React, { useState} from 'react'
import { Navigate} from 'react-router-dom'
export default function Home ( ) {
const [ sum, setSum] = useState ( 1 )
return (
< div>
< h3> 我是Home的内容< / h3>
{ }
{ sum === 1 ? < h4> sum的值为{ sum} < / h4> : < Navigate to= "/about" replace= { true } / > }
< button onClick= { ( ) => setSum ( 2 ) } > 点我将sum变为2 < / button>
< / div>
)
}
1.7
当 产生嵌套时,渲染其对应的后续子路由。 示例代码:
const element = useRoutes ( [
{
path : '/about' ,
element : < About/ >
} ,
{
path : '/home' ,
element : < Home/ > ,
children : [
{
path : 'news' ,
element : < News/ >
} ,
{
path : 'message' ,
element : < Message/ > ,
}
]
}
] )
import React from 'react'
import { NavLink, Outlet} from 'react-router-dom'
export default function Home ( ) {
return (
< div>
< h2> Home组件内容< / h2>
< div>
< ul className= "nav nav-tabs" >
< li>
< NavLink className= "list-group-item" to= "news" > News< / NavLink>
< / li>
< li>
< NavLink className= "list-group-item" to= "message" > Message< / NavLink>
< / li>
< / ul>
{ }
< Outlet / >
< / div>
< / div>
)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
2. Hooks
2.1 useRoutes()
import About from '../pages/About'
import Home from '../pages/Home'
import { Navigate} from 'react-router-dom'
export default [
{
path : '/about' ,
element : < About/ >
} ,
{
path : '/home' ,
element : < Home/ >
} ,
{
path : '/' ,
element : < Navigate to= "/about" / >
}
]
import React from 'react'
import { NavLink, useRoutes} from 'react-router-dom'
import routes from './routes'
export default function App ( ) {
const element = useRoutes ( routes)
return (
< div>
... ...
{ }
{ element}
... ...
< / div>
)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
2.2 useNavigate()
import React from 'react'
import { useNavigate} from 'react-router-dom'
export default function Demo ( ) {
const navigate = useNavigate ( )
const handle = ( ) => {
navigate ( '/login' , {
replace : false ,
state : { a : 1 , b : 2 }
} )
navigate ( - 1 )
}
return (
< div>
< button onClick= { handle} > 按钮< / button>
< / div>
)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
2.3 useParams()
作用:返回当前匹配路由的 params 参数,类似于 5.x 中的match.params。 示例代码:
import React from 'react' ;
import { Routes, Route, useParams } from 'react-router-dom' ;
import User from './pages/User.jsx'
function ProfilePage ( ) {
let { id } = useParams ( ) ;
}
function App ( ) {
return (
< Routes>
< Route path= "users/:id" element= { < User / > } / >
< / Routes>
) ;
}
2.4 useSearchParams()
作用:用于读取和修改当前位置的 URL 中的查询字符串。 返回一个包含两个值的数组,内容分别为:当前的 search 参数、更新 search 的函数。 示例代码:
import React from 'react'
import { useSearchParams} from 'react-router-dom'
export default function Detail ( ) {
const [ search, setSearch] = useSearchParams ( )
const id = search. get ( 'id' )
const title = search. get ( 'title' )
const content = search. get ( 'content' )
return (
< ul>
< li>
< button onClick= { ( ) => setSearch ( 'id=008&title=哈哈&content=嘻嘻' ) } > 点我更新一下收到的search参数< / button>
< / li>
< li> 消息编号:{ id} < / li>
< li> 消息标题:{ title} < / li>
< li> 消息内容:{ content} < / li>
< / ul>
)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2.5 useLocation()
作用:获取当前 location 信息,对标 5.x 中的路由组件的 location 属性。 示例代码:
import React from 'react'
import { useLocation} from 'react-router-dom'
export default function Detail ( ) {
const x = useLocation ( )
console. log ( '@' , x)
return (
< ul>
< li> 消息编号:{ id} < / li>
< li> 消息标题:{ title} < / li>
< li> 消息内容:{ content} < / li>
< / ul>
)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
2.6 useMatch()
作用:返回当前匹配信息,对标 5.x 中的路由组件的 match 属性。 示例代码:
< Route path= "/login/:page/:pageSize" element= { < Login / > } / >
< NavLink to= "/login/1/10" > 登录< / NavLink>
export default function Login ( ) {
const match = useMatch ( '/login/:x/:y' )
console. log ( match)
return (
< div>
< h1> Login< / h1>
< / div>
)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
2.7 useInRouterContext()
作用:如果组件在 的上下文中呈现,则 useInRouterContext 钩子返回 true,否则返回 false。
2.8 useNavigationType()
作用:返回当前的导航类型(用户是如何来到当前页面的)。 返回值:POP、PUSH、REPLACE。 备注:POP 是指在浏览器中直接打开了这个路由组件(刷新页面)。
2.9 useOutlet()
作用:用来呈现当前组件中渲染的嵌套路由。 示例代码:
const result = useOutlet ( )
console. log ( result)
2.10 useResolvedPath()
作用:给定一个 URL 值,解析其中的:path、search、hash 值。