react-router-domV6嵌套路由实现详解

目录
  • V6新特性
    • <Route>的属性变更component/render->element
    • <Link/>使用变动
    • <Redirect/> 替换为 <Navigate/>
    • <Switch/> 重命名为 <Routes/>
    • 用useNavigate代替useHistory
  • 依赖包大小从20kb减少到8kb,整体体积减少
    • 新钩子useRoutes代替react-router-config
    • 新标签:<Outlet/>
    • V6嵌套路由实现
  • 总结

V6新特性

本片文章主要叙述react-router-dom v6版本基本使用介绍,下面开始梳理一下V6的新特性,以及嵌套路由的实现。

<Route>的属性变更component/render->element

//  v5
 <Route path='/login' component={<Suspense fallback={<Loading />}><Login /></Suspense>}>
 </Route>
//  v6
  <Route path='/login' element={<Suspense fallback={<Loading />}><Login /></Suspense>}>
  </Route>

<Link/>使用变动

// 如果当前url为/home
// V5
<Link to="page1"> -> <Link to="/page1">
// V6做法
<Link to="page1"> -> <Link to="/home/page1">

当前在 /home 我需要跳转到/home/page1,在V5中是存在路由歧义的,但是V6已经修复了

<Redirect/> 替换为 <Navigate/>

// v5
<Redirect to='/login'/>
// v6
<Navigate to='/login' />

<Switch/> 重命名为 <Routes/>

// v5
// Suspense 异步加载
import {Switch,Router,Route} from 'react-router-dom'
  <Router>
    <Switch>
        <Route path='/login'>
           <Suspense fallback={<Loading />}><Login /></Suspense>
        </Route>
        <Route path='/*' >
           <Suspense fallback={<Loading />}><NotFound /></Suspense>
        </Route>
    </Switch>
    </Router>
// v6
import {Routes,Router,Route} from 'react-router-dom'
  <Router>
    <Routes>
        <Route path='/login' element={<Suspense fallback={<Loading />}><Login /></Suspense>}>
        </Route>
        <Route path='/*' element={<Suspense fallback={<Loading />}><NotFound /></Suspense>}>
        </Route>
    </Routes>
    </Router>

V5中使用component或者render去渲染,或者被当做子组件渲染,但是在V6这些方法都已经element被淘汰

用useNavigate代替useHistory

// v5
let history = useHistory()
history.push('/login');
history.replace('/login');
//v6
let navigate = useNavigate();
navigate('/login');
navigate('/login', {replace: true});

依赖包大小从20kb减少到8kb,整体体积减少

新钩子useRoutes代替react-router-config

function Page() {
  let pages = useRoutes([
    { path: '/login', element:<Login/> },
    // 404找不到
    { path: '*', element: <NotFound /> }
  ]);
  return pages;
}

新标签:<Outlet/>

   <Content style={{ height: '90vh' }}>
    <Outlet></Outlet>
   </Content>

<Outlet/>的出现帮我们节省了很多代码逻辑避免了多个< Routes />,主要用于子组件显示,作用类似于Vue中的router-view

V6嵌套路由实现

  • 路由配置routers.js
export const routerItems  = [
      {
         path:'/',
         Component:lazy(()=>import('./views/root')),
         redirect:'/designdraft',
         roles:[USER_ROLES.ADMIN,USER_ROLES.TEST],
         children:[
            {
               path:'designdraft',
               Component:lazy(()=>import('./views/designdraft/index')),
               roles:[USER_ROLES.ADMIN],
            },
            {
               path:'code',
               Component:lazy(()=>import('./views/code/index')),
               roles:[USER_ROLES.ADMIN],
               children:[],
            },
         ]
      },
      {
          path:'/login',
          Component:lazy(()=>import('./views/login')),
          children:[]
       },
       {
         path:'*',
         Component:lazy(()=>import('./views/404')),
         children:[]
       }
]
  • 嵌套路由组件封装
import{ Suspense,lazy, useEffect } from 'react';
import {routerItems } from '../routers';
// 引入
import {
  HashRouter as Router,
  Routes,
  Route,
  Navigate,
} from 'react-router-dom';
// loading页面
const Loading = () => (
  <>
     <div className='loadsvg'>
        <div>
          loading...
        </div>
     </div>
  </>
)
// 递归函数
const rotuerViews = (routerItems)=>{
  if(routerItems && routerItems.length){
    return routerItems.map(({path,Component,children,redirect})=>{
        return children && children.length ? (
            <Route path={path} key={path} element={<Suspense fallback={<Loading/>}><Component/></Suspense>}>
                   {rotuerViews(children)} // 递归遍历子路由
                   {redirect?
                   (<Route  path={path} element={<Navigate to={redirect} />}></Route>):
                   (<Route path={path} element={<Navigate to={children[0].path} />}></Route>)
                   }
            </Route>
        ):(
          <Route   key={path} path={path} element={ <Suspense fallback={<Loading/>}><Component/></Suspense>}>
          </Route>
        )
    })
  }
}
const PageView = () => {
     return (
        <Router>
          <Routes>
              {rotuerViews(routerItems)}
          </Routes>
        </Router>
     )
}
export default PageView;
  • 视图显示
class Rootpage extends React.Component {
   // 状态型组件
   constructor(props) {
      super(props)
   }
   render() {
      //  页面嵌套路由需要通过,递归路由组件,判断是否存在redirect,进行路由重定向
      let token = sessionStorage.getItem('keys');
      return (
         <>
           <div>
             // 路由跳转
              <NavLink to="/designdraft" state="admin">designdraft</NavLink>
              <NavLink to="/code" state="admin">code</NavLink>
           </div>
           <div>
             // 子路由视图显示
             <Outlet></Outlet>
           </div>
         </>
      )
   }
}
export default Rootpage
  • V5版本的路由嵌套在这里不再过多叙述了,如果你用React足够多,肯定会了解React-Router-dom-V5版本的嵌套是如何实现的

总结

React-Router-dom-V6版本不管是在体积上还是在功能方面都做了很大的升级,例如上面嵌套路由的写法来看V6确实比V5明显要好很多,毕竟代码量上就减少了不少,还有就是修复了NavLink的Url问题。关于新特性的内容就讲述这么多吧,还有没提到的部分,自己可以去官方文档了解一下

以上就是react-router-domV6嵌套路由实现详解的详细内容,更多关于react-router-domV6嵌套路由的资料请关注我们其它相关文章!

(0)

相关推荐

  • react-router-dom简介(推荐)

    目录 react-router-dom 1. 安装 2. 路由组件 2.1 路由组件 2.2 路由匹配组件 2.3 导航组件 3. 使用 3.1 基本使用 3.2 Route动态传参 3.3 嵌套路由 3.4 路由重定向 3.5 滚动还原 3.6 路由守卫 3.7代码分割 3.8 withRouter 3.9 其他hooks react-router-dom react-router-dom文档地址: https://reacttraining.com/react-router/ 1. 安装 r

  • React Router中Link和NavLink的学习心得总结

    目录 React Router Link和NavLink的学习 Link NavLink 总结 React Router Link和NavLink的学习 Link 现在,我们应用需要在各个页面间切换,如果使用锚点元素实现,在每次点击时,页面被重新加载,React Router提供了<Link>组件用来避免这种状况发生. 当 你点击<Link>时,url会更新,组件会被重新渲染,但是页面不会重新加载 先看个例子: // to为string <Link to="/abo

  • react-router v6新特性总结示例详解

    目录 支持嵌套路由 Outlet 嵌套路由可配置化 useNavigate代替useHistory 由于之前的项目一直使用的是V5版本,最新新建项目的时候,默认使用的是V6版本,根据官方的介绍,V6版本的新特性如下. 新特性 <Switch>重命名为<Routes>: <Route>的新特性变更: 嵌套路由变得更简单: 新钩子useRoutes代替react-router-config: 用useNavigate代替useHistory: Link不再支持compone

  • react-router-dom 降低版本的两种方法详解

    目录 前言 1. 使用 npm 命令降低到指定版本 2.手动修改 package.json 文件,然后 npm install 前言 react-router-dom 如今已经升级到了 V6 版本,相比较 V5 版本,变化还是挺大的.如今使用 npm install react-router-dom -S 命令来下载 react-router-dom ,会自动下载 V6 版本, V6 版本会在接下来的一段时间内成为主流.不过对于用习惯了 V5 版本的开发者而言,自然是有些不习惯.本篇文章就记录下

  • react-router-domV6版本的路由和嵌套路由写法详解

    目录 1-单级路由 2-嵌套路由(about路径进行嵌套) ReactRouterv6使用路由嵌套和重定向 1 - 单级路由 <NavLink to="/home">Home</NavLink> <NavLink to="/about">about</NavLink> <Routes>   <Route path='/home' element={<Home/>}/>   <R

  • react-router-domV6嵌套路由实现详解

    目录 V6新特性 <Route>的属性变更component/render->element <Link/>使用变动 <Redirect/> 替换为 <Navigate/> <Switch/> 重命名为 <Routes/> 用useNavigate代替useHistory 依赖包大小从20kb减少到8kb,整体体积减少 新钩子useRoutes代替react-router-config 新标签:<Outlet/> V

  • react框架next.js学习之API 路由篇详解

    目录 正文 使用方式 API 路由匹配 API 处理 API 配置 边缘计算支持 自定义 API 注意点 总结 正文 next.js 作为最热门的 react 框架,不过这么久了好像国内使用率一直不太高.最近在研究做个小项目正好做下笔记,有兴趣的可以一起来学习. next.js 首页标榜的 12 个特性之一就是 API routes,简单的说就是可以 next.js 直接写 node 代码作为后端服务来运行.因此我们可以直接使用 next.js 直接维护一个全栈项目,听起来很香的样子. 使用方式

  • vue $router和$route的区别详解

    一.router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象...经常用的跳转链接就可以用this.$router.push,和router-link跳转一样... this.$router.push会往history栈中添加一个新的记录..详细见vue官方文档 route相当于当前正在跳转的路由对象..可以从里面获取name,path,params,query等.. 打印this.$route和this.$router. 路由传参的方

  • react redux及redux持久化示例详解

    目录 一.react-redux 二.redux持久化 一.react-redux react-redux依赖于redux工作. 运行安装命令:npm i react-redux: 使用: 将Provider套在入口组件处,并且将自己的store传进去: import FilmRouter from './FilmRouter/index' import {Provider} from 'react-redux' import store from './FilmRouter/views/red

  • vue router导航守卫(router.beforeEach())的使用详解

    导航守卫 导航守卫主要用来通过跳转或取消的方式守卫导航.有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的.(记住参数或查询的改变并不会触发进入/离开的导航守卫.你可以通过观察$route对象来应对这些变化,或使用beforeRouteUpdate的组件内守卫.) 好久没写一些东西了,总是感觉有啥缺少的.~~~~恰好碰到最近在写一个移动端项目,遇到了如何使同一个链接在不同条件下跳转到不同路由组件问题,譬如大家经常看到手机中没登录跳转登录页,登陆后跳转个人信息页等.废话不多说了

  • React全家桶环境搭建过程详解

    本文介绍了React全家桶环境搭建过程详解,分享给大家,具体如下: 环境搭建 1.从零开始搭建webpack+react开发环境 2.引入Typescript 安装依赖 npm i -S @types/react @types/react-dom npm i -D typescript awesome-typescript-loader source-map-loader 新建tsconfig.json { "compilerOptions": { "outDir"

  • 基于gin的golang web开发:路由示例详解

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的命令安装Gin go get -u github.com/gin-gonic/gin 在代码里添加依赖 import "github.com/gin-gonic/gin" 快速启动一个Gin服务器的代码如下 package main import "github.com/gin-

  • golang微服务框架基础Gin基本路由使用详解

    目录 概述 1. 基本路由 2. 路由参数 获取URL路径全部参数 获取URL路径单个参数 获取URL中指定的参数 获取指定默认值的参数的 概述 路由是自定义url地址执行指定的函数,良好的路由定义可以对seo起到很好的效果. 1. 基本路由 gin框架封装了http库,提供了 GET.POST.PUT.DELETE.PATCH.HEAD.OPTIONS 这些http请求方式. 使用 router.method() 来绑定路由 func (group *RouterGroup) METHOD(r

  • 更强大的React 状态管理库Zustand使用详解

    目录 介绍 创建项目项目 安装项目依赖 创建项目结构 设置环境变量 服务 设置 store 清除/重置存储 介绍 在这篇文章中,我会介绍 Zustand 在实际项目中的使用. 我会构建一个 GitHub 用户搜索项目,在项目中通过调用 GitHub API 来实现搜索用户的功能.我还会并演示如何直接从 Zustand 存储中进行 API 调用,并将状态持久化到 sessionStorage 或 localStorage 中. 完成效果如下: 创建项目项目 首先,我们需要创建一个新的 React

随机推荐