文章目录
- 1、useRoutes() 介绍
- 2、简单 CODING
- 2.1、项目结构
- 2.2、routes.js
- 2.3、App.js
- 2.4、Result
- 3、嵌套 Outlet CODING
- 3.1、项目结构
- 3.2、routes.js
- 3.3、Home.js
- 3.4、App.js
- 3.5、Result
1、useRoutes() 介绍
- 原来写的路由管理如下
<Routes>
<Route path='/about' element={<About />} />
<Route path='/home' element={<Home />} />
<Route path='/' element={<Navigate to='/about' />} />
</Routes>
- 使用路由表
useRoutes()
后- 正常会单独建一个
routes
文件夹,文件夹下单独维护一个路由表js文件
- 正常会单独建一个
import { useRoutes } from 'react-router-dom'
// 定义路由表
const elements = useRoutes([{
path: '/about',
element: <About />
}, {
path: '/home',
element: <Home />
}, {
path: '/',
element: <Navigate to='/about' />
}])
// 在配置路由管理的地方直接插入即可
{elements}
2、简单 CODING
项目修改自 上一节 的 Demo
2.1、项目结构
2.2、routes.js
import { Navigate } from 'react-router-dom'
import About from '../components/About'
import Home from '../components/Home'
const routes = [{
path: '/about',
element: <About />
}, {
path: '/home',
element: <Home />
}, {
path: '/',
element: <Navigate to='/about' />
}]
export default routes
2.3、App.js
import React from 'react'
import { NavLink, useRoutes } from 'react-router-dom'
import routes from './routes'
export default function App() {
const activeClassName = ({ isActive }) => isActive ? 'list-group-item peiqi' : 'list-group-item'
const elements = useRoutes(routes)
return (
<div>
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<div className="page-header"><h1>React Router Demo</h1></div>
</div>
</div>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group" style={{ whiteSpace: 'pre-wrap' }}>
<NavLink className={activeClassName} to="/about">About</NavLink>
<NavLink className={activeClassName} to="/home">Home</NavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body" style={{ whiteSpace: 'pre-wrap' }}>
{/* 注册路由 */}
{elements}
</div>
</div>
</div>
</div>
</div>
)
}
2.4、Result
3、嵌套 Outlet CODING
项目后续增加的内容修改自 七、【React-Router5】嵌套路由 的 Demo
3.1、项目结构
- 增加了子组件
3.2、routes.js
- 有子路由就加
children
属性,可以无限套娃
import { Navigate } from 'react-router-dom'
import About from '../components/About'
import Home from '../components/Home'
import Message from '../components/Home/Message'
import News from '../components/Home/News'
const routes = [{
path: '/about',
element: <About />
}, {
path: '/home',
element: <Home />,
children: [{
path: 'news',
element: <News />
}, {
path: 'message',
element: <Message />
}]
}, {
path: '/',
element: <Navigate to='/about' />
}]
export default routes
3.3、Home.js
- 这里需要注意的变化
- 子路由
NavLink
的to
可以像原来一样写全 path:to="/home/news"
- 也可以直接 ./ + 子路由名:
to="./news"
- 最简单直接写子路由名:
to="news"
- 子路由组件呈现的位置直接使用 6 提供的
<Outlet>
标签声明即可,会自动分配子路由管理
- 子路由
import React from 'react'
import { NavLink, Outlet } from 'react-router-dom'
export default function Home() {
return (
<>
<h3>我是Home的内容</h3>
<div>
<ul class="nav nav-tabs">
<li>
<NavLink className='list-group-item' to="/home/news">News</NavLink>
</li>
<li>
{/* to 可以直接 ./ + 子路由名 */}
<NavLink className='list-group-item' to="./message">Message</NavLink>
</li>
<li>
{/* to 甚至可以直接写子路由名字 */}
<NavLink className='list-group-item' to="other">Other</NavLink>
</li>
</ul>
{/* 指定路由组件呈现的位置 */}
<Outlet />
</div>
</>
)
}
3.4、App.js
- 这里需要注意的变化
<NavLink end>
end 属性可以父路由失去被选中状态,默认 false
<NavLink className={activeClassName} end to="/home">Home</NavLink>