React-Router6版本的更新引起的路由用法变化

目录
  • 用法变化
  • 替换为
  • 嵌套路由
  • 重定向
  • 路由跳转
  • 路由传参
    • search传参
    • 动态路由传参
  • 其他
  • 总结

React Router应该是React生态系统中最受欢迎的库了,npm周下载量达600w+,github也有45.2k的加星,足以说明它是一款非常优秀的库,作为React社区重要的库,它经历了多次迭代和重大更改,就在上个月,更是迎来了一个大的正式版更新6.x,当前最新为6.0.2,相对比于之前的5.x版本做出了较大改变,不管从用法还是从性能上都有了明显的提升,本文也将用新老版本对比的方式让你能以最快的速度上手新用法

话不多说,先列出6.0做出的改变之处:

  1. 用法变化
  2. 替换为
  3. 嵌套路由新写法
  4. 推出全新hook,全面拥抱函数组件
  5. 基于对象的路由,实现js配置所有路由
  6. 整体代码比上个版本减小大约70%

用法变化

组件变化较大,移除了component与render属性,使用element属性替代,因为与之前的版本代码写法不能兼容,写法区别如下

  // 5.x用法
   <Route path="/home" component={Home} />
   <Route path="/login" render={()=><Login/>}/>

   // 6.x用法
   <Route path="/home" element={<Home/>} />
   <Route path="/login" component={<Login/>} />

替换为

v6版本移除了 组件,并使用替换,除了能替代 组件的功能外,也做了一些改变,比如所有的都必须包裹在中,否则抛出错误

 // 5.x用法
   <Switch>
       <Route path="/home" component={Home} />
       <Route path="/login" component={Login} />
   </Switch>

   // 6.x用法
    <Routes>
       <Route path="/home" element={<Home/>} />
       <Route path="/login" component={<Login/>} />
   </Routes>

嵌套路由

v6版本的react-router支持多种嵌套路由写法,写法分别如下:

第一种写法:延续v5版本写法,保持原有组件结构 这种写法比较适合重构的项目,不需要改变太多的代码便能过渡到v6版本

  // App.jsx
   <Routes>
       <Route path="/home" element={<Home/>} />
       <Route path="/user/*" element={<User/>} />
   </Routes>

   // User.jsx
   <Routes>
       <Route path="profile" element={<UserProfile/>} />
       <Route path=":/id" element={<UserDetail/>} />
   </Routes>

虽然组件结构与v5版本一至,但写法上有一定的差异,父组件App.jsx中的path属性最后必须使用星号(path="/user/*"),子组件User.jsx中的路径都是相对于其父级路径,所以不需要像v5版本那样写全整个路径,妈妈再也不用担心我会写错地址。

另外,如果中的path属性不以/开头,则是相对于其父级路径,这样的好处是使嵌套路由实现变得更加简单,并易于组合复杂的路由和布局

第二种写法:把所有的写在一起,配合实现路由组件的显示

 // App.jsx
   <Routes>
       <Route path="/home" element={<Home/>} />
       <Route path="/user" element={<User/>}>
           <Route path="profile" element={<UserProfile/>} />
           <Route path=":/id" element={<UserDetail/>} />
       </Route>
   </Routes>

   // User.jsx
   <Outlet/>

这样写法让我们能更清晰地去了解路由结构,能更好地管理我们的路由,而能让我们能更精确地把嵌套的路由组件布局到需要位置显示

第三种写法:使用useRoutes()实现路由配置

使用useRoutes配置路由与配置路由效果一致,只是这种写法使用javascript生成路由,不依赖JSX,返回相应结构的路由组件树,有木有感觉回到了VueRouter?有木有?

 function App(){
       // 以下写法与第二种写法效果一至
       const element = useRoutes([
          {path:'/home',element:<Home/>},
          {
               path:'/user',
               element:<User/>,
               children:[
                  {path:'profile',element:<UserProfile/>},
                  {path:':/id',element:<UserDetail/>},
              ]
          }
      ])
       return element
  }

以上三种写法各有各的优点,开发者可以根据自身的需求选择一种来实现你的嵌套路由

重定向

新版本的react-router移除了组件,但可以使用新增的组件配合组件实现重定向效果

<Routes>
       <Route path="/home" element={<Home/>} />
       <Route path="/" element={<Navigate to="/home"/>}>
   </Routes>

路由跳转

路由配置好后免不了要进行页面跳转,但新版的react-router移除了history对象,故不能使用v5版本的history(包括useHistory hook)已不能使用,我们可以使用以下两中方式进行跳转

使用或进行跳转这种方式与上一个版本几乎没有太大的区别,唯一的区别是组件的高亮写法发生了变化

   // v5版本
   <NavLink to="/home" activeStyle={{color:'#f00'}}>首页</NavLink>
   <NavLink to="/home" activeClassName="active">首页</NavLink>

   // v6版本
   <NavLink to="/home" style={({isActive})=>(isActive?{color:'#f00'}:{})}>首页</NavLink>
   <NavLink to="/home" className={({isActive})=>isActive?'current':''}>首页</NavLink>

PS: 默认已经有一个高亮的active类,可以直接使用,不需要额外设置
使用useNavigate()进行跳转有时候我们并不能使用以上两个组件进行跳转,如根据ajax请求返回值跳转不同的页面,这时我们就得使用js的方式时行跳转了,虽然新版的react-router已经移除掉history对象,但给我们提供了 useNavigate hook实现路由跳转,使用方法如下

 import { useNavigate } from "react-router-dom";
   let navigate = useNavigate();
   navigate(`/home`);

   // 跳转且不保留浏览记录
   navigate(`/home`,{replace:true});

   // 返回上一页
   navigate(-1)

   // 对象方式跳转
   navigate({
       pathname:'/home'
  })

需要注意一点就是,在v6版本的react-router中,如果跳转的路径如果不是以/开头,则为相对路径,相对于其父级路由路径,这样的设置能让我们更好的控制跳转

路由传参

我们都知道,在进行路由跳转时,可以附带一些参数一起传递到跳转页面,新版的react-router已经从props中移除了history、location、match,也移除掉了withRouter高阶组件,所以无法使用老版本的方式传参与接收,新版用法如下

search传参

 let navigate = useNavigate();
   navigate(`/home?page=1&size=10`);
   navigate({
       pathname:'/home',
       search:'page=1&size=10'
  });

在对应组件接收参数也很简单,使用useSearchParams hook进行接收,得到URLSearchParams对象以及设置search参数函数组成的数据

   function Home(){
       const [searchParams,setSearchParams] = useSearchParams()
       searchParams.get('page');//1
       searchParams.get('size');//10
       return (
           <div>首页</div>
      )
  }

动态路由传参

   <Route path="/user" element={<User/>}>
       <Route path=":/id" element={<UserDetail/>} />
   </Route>

配置完以上路由后,当页面跳转到/user/123这个路径时,可以在组件中使用useParams hook获取123这个id

function UserDetail(){
       const {id} = useParams()
       return (
           <div>id:{id}</div>
      )
  }

state传参通过、或 useNavigate进行跳转时,都可以传递state参数,用法如下:

 <Link to="/home" state={{idx:1,key:'qf'}}>首页</Link>
   navigate('/home',{state:{idx:1,key:'qf'}})

在首页组件中通过useLocation hook获取state值

 function Home(){
       const {state} = useLocation();
       state.idx; // 1
       state.key; // qf
       return (
           <div>首页</div>
      )
  }

其他

另外,React路由同样支持SSR服务端渲染等其它功能,由于篇幅在限,在此不做过多说明,感兴趣的小伙伴请继续关注我,后续的写文章专门介绍react-router在在服务端的用法。

总结

以上就是本文的所有内容,希望通过该文章能让大家对新版本react-router有个全面的认识,以便在项目中应用新版路由。更多相关React-Router6路由内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • React-router v4 路由配置方法小结

    本文主要介绍了React-router v4 路由配置方法小结,分享给大家,也给自己留个笔记 一. Switch .Router .Route三者的区别 1.Route Route 是建立location 和 ui的最直接联系 2.Router react-router v4 中,Router被拆分成了StaticRouter.MemoryRouter.BrowserRouter.HashRouter.NativeRouter. MemoryRouter.BrowserRouter.HashRo

  • React-router4路由监听的实现

    React-router 4 React Router4是一个纯React重写的包,现在的版本中已不需要路由配置,一切皆组件. 问题出发点 最近在一个新的H5项目中使用了react router 4 ("react-router-dom": "^4.2.2"),项目中的一部分页面是需要给app客户端的同学使用,这样H5项目中的title就不能一成不变,需要显示对应页面的title,所以,我们就需要去监听路由变动来更改title. 思路 在react中,例如:在父路由

  • react-router v4如何使用history控制路由跳转详解

    前言 距离React Router v4 正式发布也已经挺久了,这周把一个React的架子做了升级,之前的路由用的还是v2.7.0版的,所以决定把路由也升级下,正好"尝尝鲜"... 江湖传言,目前官方同时维护 2.x 和 4.x 两个版本.(ヾ(。ꏿ﹏ꏿ)ノ゙咦,此刻相信机智如我的你也会发现,ReactRouter v3 去哪儿了?整丢了??巴拉出锅了???敢不敢给我个完美的解释!?)事实上 3.x 版本相比于 2.x 并没有引入任何新的特性,只是将 2.x 版本中部分废弃 API 的

  • react-router 路由切换动画的实现示例

    路由切换动画 因为项目的需求,需要在路由切换的时候,加入一些比较 zb 的视觉效果,所以研究了一下.把这些学习的过程记录下来,以便以后回顾.同时也希望这些内容能够帮助一些跟我一样的菜鸟,让他们少走些坑.可能我对代码的表述不是很到位,希望大家不要介意.机智的你们一定可以看明白. 参考内容: react 路由动画 react-router Switch 组件 react 动画插件 1.插件依赖 使用的插件是react-transition-group.先简单介绍一下动画插件的使用方式. CSSTra

  • react-router JS 控制路由跳转实例

    Link组件用于正常的用户点击跳转,但是有时还需要表单跳转.点击按钮跳转等操作.这些情况怎么跟React Router对接呢? 下面是一个表单. <form onSubmit={this.handleSubmit}> <input type="text" placeholder="userName"/> <input type="text" placeholder="repo"/> <

  • react-router-dom 嵌套路由的实现

    入口文件index.js: import React from "react" import ReactDOM from "react-dom" import App from "./App.jsx" import "babel-polyfill" const root = document.getElementById("app") if (root !== null) { ReactDOM.render

  • 详解react-router4 异步加载路由两种方法

    方法一:我们要借助bundle-loader来实现按需加载. 首先,新建一个bundle.js文件: import React, { Component } from 'react' export default class Bundle extends React.Component { state = { // short for "module" but that's a keyword in js, so "mod" mod: null } componen

  • 详解前端路由实现与react-router使用姿势

    路由 对于有过SPA开发经验的人来说,路由这个名词并不陌生,前端的路由和后端的路由在实现技术上不一样,但是原理都是一样的.在 HTML5 的 history API 出现之前,前端的路由都是通过 hash 来实现的,hash 能兼容低版本的浏览器.它的 URI 规则中需要带上 #.Web 服务并不会解析 hash,也就是说 # 后的内容 Web 服务都会自动忽略,但是 JavaScript 是可以通过 window.location.hash 读取到的,读取到路径加以解析之后就可以响应不同路径的

  • 详解如何给React-Router添加路由页面切换时的过渡动画

    PS: 本篇文章使用的React-Router版本为react-router-dom: ^5.0.0 (兼容4.x) 使用过Vue2的同学们应该都知道<transition>这个内置组件,它可以帮我们添加过渡动画,之前一直用它来给Vue-Router路由的跳转添加转场动画,使用起来非常便捷.那在React中应该如何给路由切换添加过渡动画呢? react-transition-group 我们需要借助React的官方动画库react-transition-group,文档戳这里 react-tr

  • 深入理解react-router 路由的实现原理

    React Router 是一个基于 React 之上的强大路由库,它可以让你向应用中快速地添加视图和数据流,同时保持页面与 URL 间的同步.本文从两个方便来解析 react-router 实现原理.一:介绍 react-router 的依赖库history:二:使用 history 库,实现一个简单的 react-router 路由. history 介绍 history 是一个 JavaScript 库,可让您在 JavaScript 运行的任何地方轻松管理会话历史记录.history 抽

随机推荐