react-router6.x详解与使用

目录

1.react-router的两种模式

2.路由映射配置

3.路由配置和跳转

4.Navigate导航

5.手动跳转路由

6.路由参数传递

7.路由的配置文件


安装时,我们可以选择react-router-dom, react-router会包含一些react-native的内容,web开发并不需要;

npm install react-router-dom

1.react-router的两种模式

  • BrowserRouter:使用history模式

  • HashRouter:使用hash模式

配置路由模式

  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>

2.路由映射配置

  • Routes:包裹所有的Route,在其中匹配一个路由,Router5.x使用的是Switch组件

  • Route:Route用于路径的匹配

    • path属性:用于设置匹配到的路径;

    • element属性:设置匹配到路径后,渲染的组件;Router5.x使用的是component属性

    • exact:精准匹配,只有精准匹配到完全一致的路径,才会渲染对应的组件;Router6.x不再支持该属性

import { Route } from 'react-router-dom'
import Login from '../pages/Login'
import Home from '../pages/Home'

<Route path='/login' element={<Login/>}></Route>
<Route path='/home' element={<Home/>}></Route>

3.路由配置和跳转

  • Link:通常路径的跳转是使用Link组件,最终会被渲染成a元素。to属性:Link中最重要的属性,用于设置跳转到的路径

import { Link } from 'react-router-dom'

<Link to='/home'>首页</Link>
<Link to='/login'>登录</Link>

4.Navigate导航

作用:Navigate用于路由的重定向,当这个组件出现时,就会执行跳转到对应的to路径中:

设置重定向:

<Route path='/' element={<Navigate to='/home'/>}></Route>

设置路径不匹配,调整默认页面:

<Route path='*' element={<NotFound/>}></Route>

5.手动跳转路由

除了使用Link和NavLink进行组件跳转,我们还可以通过js代码来进行跳转,但是在Router6.x版本后,useNavigate()已经迁移到hook上了,而且hook只能在函数式组件上使用,那我们需要封装一个高阶组件来增强我们需要用到useNavigate()的组件,这个组件通过useNavigate()返回的对象进行路由跳转。

import { useNavigate } from "react-router-dom"

export function withRouter(WrapperComponent) {
  return props => {
    const navigate = useNavigate()
    return <WrapperComponent {...props} router={{ navigate }} />
  }
}

6.路由参数传递

路由参数传递有两种方式:

  • 动态路由的方式

动态路由映射:

<Route path='/detail/:id' element={<Detail/>}></Route>

动态路由的跳转:

navigateToDetail(item) {
  const { navigate } = this.props.router
  navigate('/detail/' + item.id)
}

动态路由参数获取(useParams函数):

import { useNavigate, useParams } from "react-router-dom"

export function withRouter(WrapperComponent) {
  return props => {
    const navigate = useNavigate()
    const params = useParams()
    return <WrapperComponent {...props} router={{ navigate, params }} />
  }
}
import React, { PureComponent } from 'react'
import { withRouter } from '../hoc'

export class Detail extends PureComponent {
  render() {
    const { params } = this.props.router
    return (
      <div>
        <h2>Detail</h2>
        <div>id: {params.id}</div>
      </div>
    )
  }
}

export default withRouter(Detail)
  • search传递参数

<Route path='/user' element={<User/>}></Route>
<Link to='/user?name=kk&age=18'>用户</Link>

使用useLocation和useSearchParams函数:

import { useNavigate, useParams, useLocation, useSearchParams, useRoutes } from "react-router-dom"

export function withRouter(WrapperComponent) {
  return props => {
    const navigate = useNavigate()
    const params = useParams()
    const location = useLocation()
    const [ searchParams ] = useSearchParams()
    const query = Object.fromEntries(searchParams)
    return <WrapperComponent {...props} router={{ navigate, params, location, query, useRoutes }} />
  }
}

使用useLocation返回的值:

使用useSearchParams返回一个数组:

拿到数组第一个值,也就是一个可迭代对象:

可迭代对象转化为普通数组:

7.路由的配置文件

目前我们所有的路由都是通过Route组件来定义的,如果我们想像vue那样有一个配置文件来配置路由,其实react也可以单独配置一个路由文件。

步骤:

const routes = [
  {
    path: '/',
    element: <Navigate to='/home'/>
  },
  {
    path: '/login',
    element: <Login/>
  },
  {
    path: '/home',
    element: <Home/>,
    children: [
      {
        path: '/home',
        element: <Navigate to='/home/recommend'/>
      },
      {
        path: '/home/recommend',
        element: <Recommend/>
      },
      {
        path: '/home/ranking',
        element: <Ranking/>
      },
      {
        path: '/home/songmenu',
        element: <HomeSongMenu/>
      },
    ]
  },
]

在react-router6.x后,我们使用useRoutes函数来完成配置,在react-router6.x之前,我们是通过react-router-config完成。

import React from 'react'
import { Link, useRoutes } from 'react-router-dom'
import routes from './router'

export function App() {
  return (
    <div>
      <div className='header'>
        <h1>header</h1>
        <Link to='/home'>首页</Link>
        <Link to='/login'>登录</Link>
      </div>
      <div className='content'>
        {
          useRoutes(routes)
        }
      </div>
      <div className='foot'>
        <h1>foot</h1>
      </div>
    </div>
  )
}

export default App

配置路由懒加载(调用React.lazy函数,这个函数需要接受一个回调函数,这个回调函数且要返回一个promise):

// 路由懒加载
const Home = React.lazy(() => import('../pages/Home'))

使用懒加载,还的使用Suspense进行包裹:

<React.Suspense fallback={ <h3>Loading</h3> }/>
  <App />
<React.Suspense/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
react-router-dom是React框架中用于处理路由的库,它提供了一种方便的方式来管理应用程序的不同页面之间的导航和状态。而import.meta.glob是ES模块的一个新特性,它可以用于动态地导入模块。 在react-router-dom 6中,import.meta.glob可以用于动态地导入路由组件。它可以根据指定的模式匹配文件路径,并将匹配到的文件作为路由组件进行导入。这样可以方便地实现按需加载路由组件,提高应用程序的性能和加载速度。 具体使用方法如下: 1. 首先,在项目中安装react-router-dom 6: ``` npm install react-router-dom@next ``` 2. 在需要使用import.meta.glob的地方,使用如下语法进行导入: ```jsx import { lazy } from 'react'; import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; const routes = import.meta.glob('/path/to/routes/*.jsx'); function App() { return ( <Router> <Routes> {Object.entries(routes).map(([path, component]) => { const routePath = path.replace('/path/to/routes', '').replace('.jsx', ''); const LazyComponent = lazy(component); return <Route key={routePath} path={routePath} element={<LazyComponent />} />; })} </Routes> </Router> ); } export default App; ``` 在上面的代码中,`import.meta.glob('/path/to/routes/*.jsx')`会根据指定的模式匹配`/path/to/routes/`目录下的所有`.jsx`文件,并返回一个对象,其中键是文件路径,值是对应的模块。 然后,我们使用`Object.entries(routes)`将对象转换为数组,并使用`map`方法遍历数组,生成对应的`Route`组件。在遍历过程中,我们使用`lazy`函数将路由组件进行懒加载,以实现按需加载的效果。 这样,我们就可以根据文件路径动态地导入路由组件,并在应用程序中进行路由配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值