当前位置: 首页 > article >正文

详细讲一下React中的路由React Router

1. 基本概念

React Router 是 React 的路由管理库,用于在 React 应用中实现页面导航和路由控制。

2. 安装

npm install react-router-dom

3. 基础用法

// App.jsx
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom'

function App() {
  return (
    <BrowserRouter>
      {/* 导航链接 */}
      <nav>
        <Link to="/">首页</Link>
        <Link to="/about">关于</Link>
        <Link to="/user">用户</Link>
      </nav>

      {/* 路由配置 */}
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/user" element={<User />} />
      </Routes>
    </BrowserRouter>
  )
}

4. 路由类型

1. BrowserRouter:使用 HTML5 history API

<BrowserRouter>
  {/* 你的应用 */}
</BrowserRouter>

2.HashRouter:使用 URL 的 hash 部分

<HashRouter>
  {/* 你的应用 */}
</HashRouter>

5. 路由导航

1.声明式导航(Link组件):

<Link to="/about">关于我们</Link>
<Link to="/user/123">用户详情</Link>

2.编程式导航(useNavigate钩子) :

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

function LoginButton() {
  const navigate = useNavigate()
  
  const handleLogin = () => {
    // 登录成功后跳转
    navigate('/dashboard')
    
    // 带参数跳转
    navigate('/user', { state: { id: 123 } })
    
    // 返回上一页
    navigate(-1)
  }
  
  return <button onClick={handleLogin}>登录</button>
}

6. 路由参数

1. URL参数:

// 路由配置
<Route path="/user/:id" element={<UserDetail />} />

// 组件中获取参数
import { useParams } from 'react-router-dom'

function UserDetail() {
  const { id } = useParams()
  return <div>用户ID:{id}</div>
}

2. 查询参数:

// 使用查询参数
<Link to="/search?keyword=react">搜索</Link>

// 获取查询参数
import { useSearchParams } from 'react-router-dom'

function Search() {
  const [searchParams] = useSearchParams()
  const keyword = searchParams.get('keyword')
  return <div>搜索关键词:{keyword}</div>
}

7. 嵌套路由

function App() {
  return (
    <Routes>
      <Route path="/" element={<Layout />}>
        <Route index element={<Home />} />
        <Route path="about" element={<About />} />
        <Route path="users" element={<Users />}>
          <Route path=":id" element={<UserDetail />} />
        </Route>
      </Route>
    </Routes>
  )
}

// Layout组件
function Layout() {
  return (
    <div>
      <nav>{/* 导航栏 */}</nav>
      <Outlet /> {/* 子路由渲染位置 */}
    </div>
  )
}

8. 路由守卫(保护路由)

function PrivateRoute({ children }) {
  const isAuthenticated = checkAuth() // 检查用户是否登录
  
  if (!isAuthenticated) {
    return <Navigate to="/login" replace />
  }
  
  return children
}

// 使用
<Route 
  path="/dashboard" 
  element={
    <PrivateRoute>
      <Dashboard />
    </PrivateRoute>
  } 
/>

9. 路由钩子

// 1. useLocation - 获取当前路由信息
function Component() {
  const location = useLocation()
  console.log(location.pathname) // 当前路径
  console.log(location.search)   // 查询参数
  console.log(location.state)    // 路由状态
}

// 2. useNavigate - 编程式导航
function Component() {
  const navigate = useNavigate()
  navigate('/path')
}

// 3. useParams - 获取URL参数
function Component() {
  const { id } = useParams()
}

// 4. useSearchParams - 获取查询参数
function Component() {
  const [searchParams, setSearchParams] = useSearchParams()
}

10. 实际应用示例

// 完整的路由配置示例
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'

function App() {
  return (
    <BrowserRouter>
      <Routes>
        {/* 公共路由 */}
        <Route path="/" element={<Layout />}>
          <Route index element={<Home />} />
          <Route path="about" element={<About />} />
          <Route path="products" element={<Products />}>
            <Route path=":id" element={<ProductDetail />} />
          </Route>
          
          {/* 需要认证的路由 */}
          <Route path="dashboard" element={
            <PrivateRoute>
              <Dashboard />
            </PrivateRoute>
          }>
            <Route path="profile" element={<Profile />} />
            <Route path="settings" element={<Settings />} />
          </Route>
          
          {/* 404页面 */}
          <Route path="*" element={<NotFound />} />
          
          {/* 重定向 */}
          <Route path="old-path" element={<Navigate to="/new-path" replace />} />
        </Route>
      </Routes>
    </BrowserRouter>
  )
}

11. 最佳实践

1.路由配置集中管理:

// routes.js
const routes = [
  {
    path: '/',
    element: <Layout />,
    children: [
      { index: true, element: <Home /> },
      { path: 'about', element: <About /> },
      { path: 'users', element: <Users /> }
    ]
  }
]

// App.jsx
import { useRoutes } from 'react-router-dom'

function App() {
  const element = useRoutes(routes)
  return element
}

2.懒加载路由:

import { lazy, Suspense } from 'react'

const Dashboard = lazy(() => import('./pages/Dashboard'))

function App() {
  return (
    <Routes>
      <Route path="/dashboard" element={
        <Suspense fallback={<Loading />}>
          <Dashboard />
        </Suspense>
      } />
    </Routes>
  )
}

这些内容涵盖了 React Router 的主要使用方法。记住:

  • 总是在应用最外层包裹 BrowserRouter
  • 使用 Routes 和 Route 定义路由规则
  • 使用 Link 或 useNavigate 进行导航
  • 合理使用路由钩子获取和操作路由信息
  • 需要时使用路由守卫保护私有路由
  • 考虑使用懒加载优化性能

http://www.kler.cn/a/461925.html

相关文章:

  • JAVA:利用 Redis 实现每周热评的技术指南
  • C语言——字符函数和内存函数
  • 线性代数自学资源推荐我的个人学习心得
  • CentOS7安装配置JDK保姆级教程(图文详解)
  • 深入解析爬虫中的算法设计:提升效率与准确度
  • MATLAB画柱状图
  • [离线数仓] 总结
  • 7.无穷级数练习
  • 使用 Python -m build打包 Python 项目:详解过程与细节
  • 为何DeepSeek V3模型为自己是ChatGPT?
  • 黑马Java面试教程_P3_框架
  • VNC Viewer安卓版安装与操作
  • 鸿蒙开发:自定义一个股票代码选择键盘
  • 【自定义控件】Qt/C++ 双侧聊天对话框控件
  • 探索电商数据:爬取不同平台商品信息的Python实践
  • 基于WOA-CNN-BiLSTM的多步预测模型
  • SpringBoot整合SpringMVC, SpringBoot扩展SpringMVC
  • 鸿蒙工程签名编译和上架
  • 【Linux】信号处理
  • Java重要面试名词整理(十八):Sentinel
  • 【马来西亚博特拉大主办】第五届电网系统与绿色能源国际学术会议(PGSGE 2025)
  • 【gopher的java学习笔记】依赖管理方式对比(go mod maven)
  • java中多线程的一些常见操作
  • Git快速入门(二)·本地仓库·GitHubDesktop的使用
  • 如何使用python清空特定路径下所有文件夹下中的文件,把空文件夹要保留下来
  • 【开源免费】基于Vue和SpringBoot的共享汽车管理系统(附论文)