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.youkuaiyun.com/Lil_y1/article/details/140613312?spm=1001.2014.3001.5502

### 实现 React v6 路由懒加载 在 React 应用程序中,通过 `lazy` 函数和 `Suspense` 组件可以轻松实现路由的懒加载功能。这种方式不仅能够优化应用性能,还能提升用户体验。 #### 使用 `lazy` 和 `Suspense` 为了启用懒加载特性,在导入组件时不再采用静态方式而是利用 `React.lazy()` 动态导入组件。这使得只有当特定路径被访问时才会去加载对应的模块。配合 `Suspense` 可以为用户提供友好的等待反馈机制[^1]。 下面是一个简单的例子展示如何设置: ```jsx import React, { Suspense, lazy } from 'react'; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; // 声明式定义要延迟加载的组件 const Home = lazy(() => import('./pages/Home')); const About = lazy(() => import('./pages/About')); function App() { return ( <Router> {/* 当子组件尚未准备好渲染前显示 Loading */} <Suspense fallback={<div>Loading...</div>}> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> </Routes> </Suspense> </Router> ); } export default App; ``` 此代码片段展示了如何配置基本的懒加载路由。每当用户导航至 `/` 或者 `/about` 地址时,相应的页面组件会被按需加载并呈现给用户。 对于更复杂的场景,比如带有嵌套路由的应用,则可以在每个独立的布局或容器内重复上述模式来进一步细化控制哪些部分应该参与懒加载过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值