react-router-dom v6
核心概念: router 存储路由文件
目录结构: router
index.js
components
Header
index.jsx
pages
About
index.jsx
Home
index.jsx
Message
index.jsx
Detail
index.jsx
News
index.jsx
index.js
App.js
router
核心内容: (1)定义routes数组 存放路由规则对象{path,element},嵌套路由通过children
代码示例:
import About from '../pages/About'
import Home from '../pages/Home'
import { Navigate } from 'react-router-dom'
import News from '../pages/Home/News'
import Message from '../pages/Home/Message'
import Detail from '../pages/Home/Message/Detail'
export const routes = [{
path: '/about',
element: <About/>,
},
{
path: '/home',
element: <Home/>,
children: [{
path: 'news',
element: <News/>,
},
{
path: 'message',
element: <Message/>,
children: [{
path: 'detail',
element: <Detail/>,
}]
},
]
},
{
path: '/',
element: <Navigate to="/about" />,
}
]
App.js
代码示例:
import React from 'react'
import Header from './components/Header'
import { NavLink, useRoutes } from 'react-router-dom'
import {routes} from './router'
export default function App() {
const element = useRoutes(routes)
function computedISActive(isActive) {
return isActive? 'list-group-item pink': 'list-group-item'
}
return (
<div>
<div>
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<Header/>
</div>
</div>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
<NavLink className={({isActive}) => computedISActive(isActive)} to="/about" >About</NavLink>
<br></br>
<NavLink className={({isActive}) => computedISActive(isActive)} to="/home" >Home</NavLink>
</div>
</div>
<br></br>
<br></br>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
{/*<Routes>
<Route path='/about' element={<About/>} />
<Route path='/home' element={<Home/>} />
<Route path='/' element={<Navigate to='/about'/>} />
</Routes>*/}
{element}
</div>
</div>
</div>
</div>
</div>
</div>
)
}
index.js
核心内容: (1)通过 BrowserRouter/HashRouter 包裹根组件App
代码示例:
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import {BrowserRouter} from 'react-router-dom'
ReactDOM.render(
<BrowserRouter>
<App/>
</BrowserRouter>,
document.getElementById('root'))
一般组件使用路由属性
核心内容: (1) 通过 useNavigate hook
代码示例:
import React from 'react'
import { useNavigate } from 'react-router-dom'
export default function Header() {
const navigate = useNavigate()
function forward() {
navigate(1)
}
function back() {
navigate(-1)
}
return (
<div><div className="page-header"><h2>
React Router Demo
<button onClick={forward}>前进</button>
<button onClick={back} >后退</button>
</h2></div></div>
)
}
嵌套路由中展示子路由
核心内容: (1) Outlet 组件占位
(2) link 中to属性不用 /
import React from 'react'
import { Link } from 'react-router-dom'
import { Outlet, useOutlet } from 'react-router-dom'
export default function Home() {
console.log('********',useOutlet())
return (
<div>
我是Home的内容
<br></br>
<br></br>
<br></br>
<ul className="nav nav-tabs">
<Link to='news'>News</Link>
<Link to='message'>Message</Link>
</ul>
{/** 指定路由组件呈现的位置 */}
<Outlet/>
</div>
)
}
路由组件使用函数式路由
核心内容: (1) useNavigate hook
import React from 'react'
import { useState } from 'react'
import { Link, Outlet, useNavigate } from 'react-router-dom'
export default function Message() {
const [message] = useState(['message1','message2','message3'])
const navigate = useNavigate()
function change(item) {
console.log(navigate)
navigate('detail', {
replace: false,
state: {
item,
}
})
}
return (
<div>
{message.map((item,index) =>{
return(
<li key={index}>
{/*<Link to={`detail?item=${item}`}>{item}</Link>*/}
<Link to="detail" state={
{item,}
}>{item}</Link>
<button onClick={() => change(item)}>查看详情</button>
</li>
)
} )}
<Outlet/>
</div>
)
}
路由组件接收参数
核心内容: (1)useSearchParams useLocation hooks
import React from 'react'
import { useSearchParams, useLocation } from 'react-router-dom'
export default function Detail() {
const [search] = useSearchParams()
console.log(search.get('item'), useLocation())
const {item} = useLocation().state
return (
<div>
Detail
<br/>
{item}
</div>
)
}