点击实现路由跳转
- 修改key值
<Menu.Item key="list"><ReadOutlined /> 查看文章列表</Menu.Item> <Menu.Item key="edit"><EditOutlined /> 文章编辑</Menu.Item> <Menu.Item key="means"><DatabaseOutlined /> 修改资料</Menu.Item> 复制代码
- 使用hook跳转
import {useNavigate} from 'react-router-dom' const navigate = useNavigate() 复制代码
// 修改handleClick const handleClick = e => { navigate('/'+e.key) }; 复制代码
// 默认路由 defaultSelectedKeys={['list']} 复制代码
- 实现效果
遇到的bug
刷新之后路径并未改变,菜单栏改变了。
- 片段代码
引入useLocation
import React, { useEffect, useState } from 'react' import {useNavigate, useLocation} from 'react-router-dom' const location = useLocation() const [defaultKey, setDefaultKey] = useState('') // 一旦渲染立刻获取动态的路由路径,不在使用默认的 useEffect(() => { let path = location.pathname; let key = path.split('/')[1]; setDefaultKey(key) }, []); // 及时更新路由路径 const handleClick = e => { navigate('/'+e.key) setDefaultKey(e.key) }; 复制代码
- 实现效果图(自己刷新试试咯)
面包屑
传送门
- 创建Bread组件
初始化书写Bread组件
import React from 'react'; import { Breadcrumb } from 'antd'; import { HomeOutlined } from '@ant-design/icons'; const Bread = () => { return ( <Breadcrumb> <Breadcrumb.Item href=""> <HomeOutlined /> </Breadcrumb.Item> <Breadcrumb.Item>Application</Breadcrumb.Item> </Breadcrumb> ); } export default Bread; 复制代码
在App组件中引入一个Bread组件
import Bread from './components/Bread' <div className='container_box'> <Bread/> <Outlet/> </div> 复制代码
- 根据路径更新面包屑
更新面包屑名字(useEffect取过来,useState再赋值更新上)
// 引入hook import React, {useState,useEffect} from 'react'; // 设置变量 const [breadName, setBreadName] = useState('') // 获取路径 const {pathname} = useLocation() // 不是在组件mounted时去获取路径,而是路径一旦变化,就要获取对应的路径名称,并且修改breadName // 监听路由的路径(/list /edit /means) useEffect(() => { switch (pathname) { case "/list": setBreadName('查看文章列表'); break; case "/edit": setBreadName('文章编辑'); break; case "/means": setBreadName('修改资料'); break; default: break; } }, [pathname]) 复制代码
内容补充(表单,表格)
- 创建2个路由组件
- 配置路由(index.jsx)
import ListTable from '../pages/ListTable' import ListList from '../pages/ListList' const BaseRouter = () => ( <Router> <Routes> <Route path='/' element={<App />}> <Route path='/listtable' element={<ListTable />}></Route> <Route path='/listlist' element={<ListList />}></Route> <Route path='/edit' element={<Edit />}></Route> <Route path='/means' element={<Means />}> </Route> </Route> <Route path='/login' element={<Login />}> </Route> <Route path='/register' element={<Register />}> </Route> </Routes> </Router> ) 复制代码
- 修改面包屑
useEffect(() => { switch (pathname) { case "/listlist": setBreadName('查看文章列表List'); break; case "/listtable": setBreadName('查看文章列表Table'); break; case "/edit": setBreadName('文章编辑'); break; case "/means": setBreadName('修改资料'); break; default: setBreadName(pathname.includes('edit') ? '文章编辑' : ""); break; } }, [pathname]) 复制代码
- 修改侧边栏
<Menu.Item key="listlist"><ReadOutlined /> 查看文章列表List</Menu.Item> <Menu.Item key="listtable"><ReadOutlined /> 查看文章列表Table</Menu.Item> 复制代码
- 实现效果
ListTable 书写样式
- 在APP组件中设置布局属性
<div className='container_box'> <Bread/> <Outlet/> </div> 复制代码
base.less
.container .container_box { flex: 1; box-sizing: border-box; padding: 20px; display: flex; flex-direction: column; } 复制代码
- 创建less文件
.list_table{ width: 100%; background: #fff; height: 100%; } 复制代码
- 引入less样式到ListTable
import './less/ListTable.less' // 不要忘记添加类名 <div className='list_table'>ListTable</div> 复制代码
- 实现效果图