React 路由篇(v6)

写在开头

本文是根据尚硅谷react课程React Router Dom v6篇的总结笔记


01_一级路由

        Router 6中一级路由跟5版本大体结构是差不多的,具体细节在注册路由组件时,5版本中的component更改为element且组件写法也不同了。

// NavLink 路由链接
<NavLink to='/home'>Home</NavLink>
// Link 路由链接
<Link to='/home'>Home</Link>
// 路由组件
<Route path='/home' element={<Home />} /> // v6
//<Route path='/home' component={Home>} /> // v5

v5中的包裹多组件实现路径组件一一匹配的Switch已经废除,取而代之的是Routes

<Routes>
     <Route path='/about' element={<About />} />
     <Route path='/home' element={<Home />} />
</Routes>

02_NavLink的高亮显示

        v5中NavLink高亮显示由activeClassName实现,v6中这个方法已经废除了,此时实现高亮效果用的是className,它会有一个回调函数,参数为一个名为isActive的对象,该对象中同名isActive属性保存着该路由是否被激活,结果为true时即激活时返回所要高亮效果类名。

// 封装一个函数来控制高亮
const computedClassName = (isActive) => {
    return isActive ? 'base active' : 'base'
}
<NavLink
     className={({ isActive }) => computedClassName(isActive)}
     to='/home'
>Home</NavLink>

03_重定向

        v5中重定向会在所有路由下使用Redirect来进行重定向,在v6中我们使用Navigate

// 引入Navigate
import { NavLink, Route, Routes, Navigate } from 'react-router-dom'
// 使用
<Routes>
    <Route path='/about' element={<About />} />
    <Route path='/home' element={<Home />} />
    {/* 重定向 */}
    <Route path='/' element={<Navigate to='/about' />} />
</Routes>

04_路由表

        v6中引入了路由表这个概念,简化了注册路由,同时更明显的展示路由的嵌套结构,使用到useRoutes。一般我们会另外创建一个routes文件来单独建立路由表,这样更加清晰明了。

组件

import { NavLink, useRoutes } from 'react-router-dom'
// 引入路由表文件
import routes from './routes'
// 调用useRoutes
const element = useRoutes(routes)
// 路由链接
<NavLink>Home</NavLink>
// 注册路由
<div>{element}</div>

路由表

import Home from '../pages/Home'
import About from '../pages/About'
import { Navigate } from 'react-router-dom'
const routes = [
  {
    path: '/about',
    element: <About />,
  },
  {
    path: '/home',
    element: <Home />,
  },
  {
    path: '/',
    element: <Navigate to='/about' />,
  },
]
export default routes

05-嵌套路由

        嵌套路由我们只需要在路由表中你所需要的组件添加一个children属性

const routes = [
  {
    path: '/about',
    element: <About />,
  },
  {
    path: '/home',
    element: <Home />,
    // 实现嵌套路由
    children: [
      {
        path: 'news',
        element:<News />
      },
      {
        path: 'message',
        element:<Message />
      }
    ]
  },
  {
    path: '/',
    element: <Navigate to='/about' />,
  },
]

此时我们会面对一个问题,子路由位置怎么放,这时引入Outlet。类似于vue中的router-view

// 引入
import { Outlet } from 'react-router-dom'
{/* 路由显示位置 */}
<Outlet />

06-路由参数传递_params

        v6中params参数的传递和接收没太大变化,但是我们使用params参数时要借助useParams函数

{/* 传递params参数 */}
<Link to={`detail/${item.id}/${item.title}/${item.content}`}>{item.title}</Link>

// 路由表中接收params参数
path: 'detail/:id/:title/:content'

// 使用params参数
import { useParams } from 'react-router-dom'
const { id, title, content } = useParams()

07-路由参数传递_search

        v6中search参数的传递和接收没太大变化,但是我们使用search参数时要借助useSearchParams函数

{/* 传递search参数 */}
<Link to={`detail/?id=${item.id}&title=${item.title}&content=${item.content}`}>
    {item.title}
</Link> */}

// 路由表中 无需变化
 path:'detail', //search 参数接收

// 使用search参数
import { useSearchParams } from 'react-router-dom'
const [search] = useSearchParams()
const id = search.get('id')
const title =search.get('title')
const content =search.get('content')

08-路由参数传递_state

        v6中params参数的接收没有太大变化,但传递时我们要在路由链接中直接使用state={{key=value}}来传递,同时我们使用state参数时要借助useLoaction函数

{/* 传递state参数 */}
<Link to='detail' state={{id: item.id,title:item.title,content:item.content}}>
    {item.title}
</Link>
 
// 路由表中state参数接收
path:'detail', //state 参数接收

// 使用state参数
import { useLocation } from 'react-router-dom'
const {state:{id,title,content}} = useLocation()

09-编程式路由导航

        v5中我们往往是使用this.prosp.history类似这样的方法进行操作,而在v6中我们使用useNavigate钩子

// 引入
import { useNavigate } from 'react-router-dom'
// 调用
const navigate = useNavigate()
// 使用
<button onClick={()=>navigate(1)}>前进</button>
<button onClick={()=>back(-1)}>后退</button>

10-路由懒加载

        在大型的 React 应用中,为了提高页面加载速度和性能,我们经常会使用懒加载技术来延迟加载组件或资源。懒加载可以将页面初始加载的内容减少到最小,只在需要时再动态加载额外的组件或资源,从而提高页面的加载速度和用户体验

在 React 中,我们可以使用 lazy 函数和 Suspense 组件来实现懒加载。lazy 函数允许我们动态地 import 一个组件,而 Suspense 组件则允许我们在组件加载时显示一个加载指示器。

import React, { Suspense, lazy } from 'react';

const MyComponent = lazy(() => import('./MyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <MyComponent />
    </Suspense>
  );
}

export default App;

11-剩余Hooks

useInRouterContext()

        -作用:如果组件在<Router>的上下文中呈现则该钩子返回true,否则返回false

useNavigate()

        -作用:返回当前的导航类型

        -返回值:PUSH 、POP、REPLACE

        -备注: pop指在浏览器直接打开这个路由组件

useOutlet()

        -作用:用来呈现当前组件中要渲染的嵌套组件

        -示例代码:

const res = useOutlet()
console.log(res)
// 若嵌套路由没有挂载为null
// 已经挂载则展示嵌套的路由组件

 useResolvedPath()

        -作用:给定一个url值,解析其中的path,search,hash值

写在结尾

需要了解v5版本:https://blog.csdn.net/Lil_y1/article/details/140613312?spm=1001.2014.3001.5502

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React v6中的路由使用react-router-dom库进行管理。通过使用以下命令安装该库:`yarn add react-router-dom@6`。 相较于之前的版本,V6版本的react-router-dom进行了一些改进。嵌套路由的写法有所改变,并且引入了新的钩子函数useNavigate来替代useHistory,使整体更易于理解。 React中有三种常用的路由方式:react-router-dom适用于浏览器的路由,BrowerRouter基于浏览器的history,HashRouter基于地址部分的hash值(路由带“#”)。而react-router-native适用于原生app的路由react-router是原生与浏览器通用的部分。 在React v6中,你可以使用`yarn add react-router-dom@6`来安装React Router。安装后,你可以使用`BrowserRouter`组件来创建基于浏览器的路由,或者使用`HashRouter`组件来创建基于地址栏hash值的路由。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [React-Router V6 使用详解](https://blog.csdn.net/zjjcchina/article/details/121921585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【React学习】React路由 v6](https://blog.csdn.net/zx1041561837/article/details/125970331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值