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

前言

18 年初,React Router的主要开发人员创建一个名为Reach Router的轻量级替代方案。

原来是相互抗衡的,却没想React Router直接拿来合并(真香!)

目前 v6已是测试最后一版,估计新的特性不出意外就是下面这些了:

  1.  重命名为
  2.  的新特性变更。
  3.  嵌套路由变得更简单。
  4.  用useNavigate代替useHistory。
  5.  新钩子useRoutes代替react-router-config。
  6.  大小减少:从20kb到8kb

1. 重命名为

该顶级组件将被重命名。但是,其功能大部分保持不变(嗨,瞎折腾)。

 
 
 
 
  1. // v5  
  2.   
  3.       
  4.       
  5.   
  6. // v6  
  7.   
  8.     } />  
  9.     } />  
  10.  

2. 的新特性变更

component/render被element替代

总而言之,简而言之。就是变得更好用了。

 
 
 
 
  1. import Profile from './Profile';  
  2. // v5  
  3.   
  4.   path=":userId"  
  5.   render={routeProps => (  
  6.       
  7.   )}  
  8. />  
  9. // v6  
  10. } />  
  11. } /> 

3. 嵌套路由变得更简单

具体变化有以下:

  •   已更改为接受子路由。
  •  比更简单的匹配规则。
  •   路径层次更清晰。

3.1 简化嵌套路由定义

v5中的嵌套路由必须非常明确定义,且要求在这些组件中包含许多字符串匹配逻辑(活久见啊,终于意识到这个问题了。)

且看之前的处理:

 
 
 
 
  1. // v5  
  2. import {  
  3.   BrowserRouter,  
  4.   Switch,  
  5.   Route,  
  6.   Link,  
  7.   useRouteMatch  
  8. } from 'react-router-dom';  
  9. function App() {  
  10.   return (  
  11.       
  12.         
  13.           
  14.           
  15.         
  16.       
  17.   );  
  18. }  
  19. function Profile() {  
  20.   let { path, url } = useRouteMatch();  
  21.   return (  
  22.     
      
  23.       
  24.         My Profile  
  25.         
  26.         
  27.           
  28.             
  29.           
  30.           
  31.             
  32.           
  33.         
  34.     
  
  •   );  
  • 而在v6中,你可以删除字符串匹配逻辑。不需要任何useRouteMatch()!

     
     
     
     
    1. // v6  
    2. import {  
    3.   BrowserRouter,  
    4.   Routes,  
    5.   Route,  
    6.   Link,  
    7.   Outlet  
    8. } from 'react-router-dom';  
    9. function App() {  
    10.   return (  
    11.       
    12.         
    13.         } />  
    14.         } />  
    15.         
    16.       
    17.   );  
    18. }  
    19. function Profile() {  
    20.   return (  
    21.     
        
    22.       
    23.         My Profile  
    24.         
    25.         
    26.         } />  
    27.         } />  
    28.         
    29.     
      
  •   );  
  • 当然,还有更酸爽的操作,直接在路由里定义,然后用接下来的一个新API:Outlet

    3.2 新API:Outlet

    这玩意儿,像极了{this.props.children},具体用法看以下例子:

     
     
     
     
    1. function App() {  
    2.   return (  
    3.       
    4.         
    5.         } />  
    6.         }>  
    7.           } />  
    8.           } />  
    9.           
    10.         
    11.       
    12.   );  
    13. }  
    14. function Profile() {  
    15.   return (  
    16.     
        
    17.       
    18.         My Profile  
    19.         
    20.         {/*  
    21.        将直接根据上面定义的不同路由参数,渲染  
    22.         */}  
    23.         
    24.     
      
  •   )  
  • 3.3 多个

    以前,我们只能 在React App中使用一个 Routes。但是现在我们可以在React App中使用多个路由,这将帮助我们基于不同的路由管理多个应用程序逻辑。

     
     
     
     
    1. import React from 'react';  
    2. import { Routes, Route } from 'react-router-dom';  
    3. function Dashboard() {  
    4.   return (  
    5.     
        
    6.       

      Look, more routes!

        
    7.         
    8.         } />  
    9.         } />  
    10.         
    11.       
    12.   );  
    13. }  
    14. function App() {  
    15.   return (  
    16.       
    17.       } />  
    18.       } />  
    19.       
    20.   );  

    4. 用useNavigate代替useHistory

    从一目了然改到双目失明。。。

    总感觉React Router团队有点儿戏。。。

     
     
     
     
    1. // v5  
    2. import { useHistory } from 'react-router-dom';  
    3. function MyButton() {  
    4.   let history = useHistory();  
    5.   function handleClick() {  
    6.     history.push('/home');  
    7.   };  
    8.   return Submit;  
    9. }; 

    现在,history.push()将替换为navigation():

     
     
     
     
    1. // v6  
    2. import { useNavigate } from 'react-router-dom';  
    3. function MyButton() {  
    4.   let navigate = useNavigate();  
    5.   function handleClick() {  
    6.     navigate('/home');  
    7.   };  
    8.   return Submit;  
    9. }; 

    history的用法也将被替换成:

     
     
     
     
    1. // v5  
    2. history.push('/home');  
    3. history.replace('/home');  
    4. // v6  
    5. navigate('/home');  
    6. navigate('/home', {replace: true}); 

    强行达成共识

    5. 新钩子useRoutes代替react-router-config。

    感觉又是一波强行hooks,但还是相对于之前简洁了一些。。。

     
     
     
     
    1. function App() {  
    2.   let element = useRoutes([  
    3.     { path: '/', element:  },  
    4.     { path: 'dashboard', element:  },  
    5.     { path: 'invoices',  
    6.       element: ,  
    7.       children: [  
    8.         { path: ':id', element:  },  
    9.         { path: 'sent', element:  }  
    10.       ]  
    11.     },  
    12.     // 重定向  
    13.     { path: 'home', redirectTo: '/' },  
    14.     // 404找不到  
    15.     { path: '*', element:  }  
    16.   ]);  
    17.   return element;  

    6. 大小减少:从20kb到8kb

    React Router v6给我们带来方便的同时,还把包减少了一半以上的体积。。。

    感觉可以去看一波源码了。。。

    7. 迁移及其它重要修复...

    官方的迁移指南在这里:React Router v6 迁移指南

    其实上面所列的新特性,基本就是迁移的全部内容了。

    基础的起手式就是更新包:

     
     
     
     
    1. $ npm install react-router@6 react-router-dom@6  
    2. # or, for a React Native app  
    3. $ npm install react-router@6 react-router-native@6 

    其中我觉得特别需要注意的一点是:React Router v6 使用简化的路径格,仅支持 2 种占位符:动态:id样式参数和*通配符

    以下都是 v6 中的有效路由路径:

     
     
     
     
    1. /groups  
    2. /groups/admin  
    3. /users/:id  
    4. /users/:id/messages  
    5. /files/*  
    6. /files/:id/*  
    7. /files-* 

    使用RegExp正则匹配的路径将无效:

     
     
     
     
    1. /users/:id?  
    2. /tweets/:id(\d+)  
    3. /files/*/cat.jpg 

    v6中的所有路径匹配都将忽略 URL 上的尾部"/"。实际上,已被删除并且在 v6 中无效。这并不意味着您不需要使用斜杠。

    在v5版本之前的路径,存在路由歧义

    1.  当前路径:"/users",则将跳转
    2.  当前路径:"/users/",则将跳转

    React Router v6修复了这种歧义,取消了尾部"/":

    1.  当前路径:"/users",则将跳转
    2.  当前路径:"/users",则将跳转

    其形式更像命令行cd的用法:

     
     
     
     
    1. // 当前路径为 /app/dashboard  
    2.  
    3.                //   
    4.             //   
    5.          //   
    6.       //   
    7. // 命令行当前路径为 /app/dashboard  
    8. cd stats                        // pwd is /app/dashboard/stats  
    9. cd ../stats                     // pwd is /app/stats  
    10. cd ../../stats                  // pwd is /stats  
    11. cd ../../../stats               // pwd is /stats  

    当前题目:React-Router v6新特性解读及迁移指南
    当前路径:http://www.shufengxianlan.com/qtweb/news18/389168.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    网站排名知识

    分类信息网站