react-router v6新特性总结

Posted xiangzhihong8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react-router v6新特性总结相关的知识,希望对你有一定的参考价值。

由于之前的项目一直使用的是V5版本,最新新建项目的时候,默认使用的是V6版本,根据官方的介绍,V6版本的新特性如下。

新特性

  • <Switch>重命名为<Routes>
  • <Route>的新特性变更;
  • 嵌套路由变得更简单;
  • 新钩子useRoutes代替react-router-config;
  • 用useNavigate代替useHistory;
  • Link不再支持component 属性;
  • NavLink的exact属性替换为end
  • 大小减少:从20kb到8kb

<Switch>重命名为<Routes>

在V6版本中,<Switch>组件被替换成<Routes>组件,同时,component属性被element属性替换。

/* v5 */
<Switch>
  <Route exact path="/" component=Home />
  <Route path="/user/:id" render=(routeProps) => <User id=routeProps.match.params.id /> />
</Switch>

/* V6 */
<Routes>
  <Route path="/" element=<Home /> />
  <Route path="user/:id" element=<User id=id /> />
</Routes>

同时,组件还修改了如下一些内容:

  • 废弃exact
  • component/render被element替代
  • routeProps可以在element中直接获取
  • 简化的路径匹配,仅支持动态:id样式参数和*通配符,不再支持RegExp

支持嵌套路由

在V6版本中, <Route>标签支持嵌套,可以在一个文件内配置嵌套路由,便于统一管理路由。

import  HashRouter as Router, Routes, Route  from 'react-router-dom'
import Home from '@/pages/demo/Home'
import Foo from '@/pages/demo/Foo'
import Bar from '@/pages/demo/Bar'
import BarDetail from '@/pages/demo/BarDetail'
import '@/assets/style/App.css'
function App() 
 return (
   <Router>
     <Routes>
       <Route path="/" element=<Home /> />
       <Route path="foo" element=<Foo /> />
       /* 嵌套路由场景:需要在Bar(父路由的组件)声明Outlet组件,用于渲染子路由 */
       <Route path="bar" element=<Bar />>
         <Route path=":id" element=<BarDetail /> />
       </Route>
     </Routes>
   </Router>
 )

export default App

Outlet

在嵌套路由场景,我们需要在父路由中使用Outlet组件,用于渲染子路由。

import  Outlet  from 'react-router-dom'
function Bar() 
  return (
    <div>
      <div>Bar</div>
      /* 有嵌套路由的场景需要使用 */
      <Outlet />
    </div>
  )

export default Bar

嵌套路由可配置化

在V6版本中,我们可以使用useRoutes代替react-router-config配置。如果需要用到嵌套路由,那么Outlet组件也是必要的。

import  useRoutes  from 'react-router-dom'
import Home from '@/pages/demo/Home'
import Foo from '@/pages/demo/Foo'
import Bar from '@/pages/demo/Bar'
import BarDetail from '@/pages/demo/BarDetail'
import '@/assets/style/App.css'
function App() 
  let element = useRoutes([
    
      path: '/',
      element: <Home />
    ,
    
      path: 'foo',
      element: <Foo />
    ,
    
      path: 'bar',
      element: <Bar />,
      children: [
        
          path: ':id',
          element: <BarDetail />
        
      ]
    
  ])
  return element

export default App

需要注意的是,如果是使用此方式注册路由配置,需要在入口文件添加Router包裹App组件,否则会报错。

import React from 'react'
import ReactDOM from 'react-dom'
import  HashRouter as Router  from 'react-router-dom'
import App from '@/App'
import '@/assets/style/index.css'
ReactDOM.render(
  <React.StrictMode>
    <Router>
      <App />
    </Router>
  </React.StrictMode>,
  document.getElementById('root')
)

useNavigate代替useHistory

/* v5 */
const history = useHistory()
history.push('/home')
history.replace('/home')
history.goBack()
history.goForward()
history.go(2)
/* V6 */
const navigate = useNavigate()
navigate('/home')
navigate('/home', replace: true)
navigate(-1)
navigate(1)
navigate(2)

参考说明:https://reactrouterdotcom.fly.dev/

以上是关于react-router v6新特性总结的主要内容,如果未能解决你的问题,请参考以下文章

React-Router v6 新特性解读及迁移指南

react-router v6新特性

2021 react-router v6 快速入门

react-router路由之routerRender方法(v5 v6)

react-router v6对比react-router v5

React-router v6 该怎么用?