最近新写了一个react项目, 发现react router默认装到了v6版本,而v6与v5比还是有比较大的更新的,这里记录一下
首先就是switch被routes替换, route废弃了component与render属性, Redirect被Navigate替换
以前我们的路由写法(v5)
<BrowserRouter> <Switch> <Route path='/ui' component={Ui} /> <Route path='/login' component={Login} /> <Route path='/error' component={ErrorPage} /> <Redirect to='/ui' /> </Switch> </BrowserRouter>
现在(v6)
<BrowserRouter> <Routes> <Route path='/login' element={<Login />} /> <Route path='/error' element={<ErrorPage />} /> <Route path='*' element={<Navigate to='/ui' />} /> </Routes> </BrowserRouter>
可以看到在新版路由中,route的element属性需要传入一个组件,而不是组件名,默认跳转需要用*路由匹配,然后使用Navigate跳转
嵌套路由(v5)
在v5中,我们定义一个大组件,在内容区填写路由,根据路由渲染不同的内容区,在v6中也发生了改变
v5写法
App.js
<BrowserRouter> <Route component=<Ui> /> </BrowserRouter>
Ui.js
<Header/> <Content> <Switch> <Route path='/ui/api/logs' component={ApiLogs} /> <Route path='/ui/user/group' component={GroupList} /> </Switch> </Content>
而在v6中,这个写法发生了变化
App.js
<Routes> <Route path="/" element={<Layout />} > <Route path="dashboard" element={<Dashboard />} /> </Route> <Route path="/login" element={<Login />} /> <Route path="*" element={<Navigate to="/" />} /> </Routes>
Ui.js
<Header/> <Content> <Outlet/> </Content>
可以看到,现在路由直接写在最外侧,在需要根据路由动态渲染的地方,使用Outlet这个组件进行占位
关于传参
在Link中, state的传参方式发生了变化
在传参的地方
<Link to="/view" state={{data:recoder}} />
在组件里接收
import { useLocation } from 'react-router-dom' function TicketView(props) { const Stateparams = useLocation() return <h1>hello</h1> } export default TicketView
Stateparams.state里面就是我们在link组件中传入的state
关于路由跳转
import { Button } from 'antd' import { useNavigate } from 'react-router-dom' function GoBack(props) { const navigate = useNavigate(); return ( <Button onClick={() => navigate('/xxx', {state: {type: "xxxx"}})} /> ) } export default GoBack
使用useNavigate这个函数, 调用得到一个navigate函数, 第一个参数是路径, 第二个参数是一些选项, 比较常用的有state, 可以在路由跳转的时候进行传参
目前项目刚开始写,以后发现什么坑继续更新~
发表回复