首页 > 其他分享 >详细讲一下React中的路由React Router

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

时间:2024-12-27 20:54:58浏览次数:7  
标签:function react const return React import 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 进行导航
  • 合理使用路由钩子获取和操作路由信息
  • 需要时使用路由守卫保护私有路由
  • 考虑使用懒加载优化性能

标签:function,react,const,return,React,import,Router,路由
From: https://blog.csdn.net/m0_73574455/article/details/144777301

相关文章

  • ReactJS最优秀的UI框架
    上篇文章中写了流行的前端UI几大框架,发现大部分评价都是Vue的UI组件库,从评论中得知漏掉了很多,也有人问Reactui,自己就搜索总结下适应于ReactJS的UI组件库。一.Material-UIMaterial-UI是一款React组件库来实现Google的MaterialDesign风格UI界面框架。也是首个React的UI工具集之......
  • React 移动端框架
    1.Material-UIMaterial-UI组件是独立工作的。它们是自我支持的,并只要注入而且仅注入它们需要显示的样式。他们不依赖任何全局的样式表,如 normalize.css。Material-UI首先是移动开发的,我们首先为移动设备编写代码,然后根据需要使用CSS媒体查询扩展组件。要确保所有设备的正确......
  • React Setup
    useState是React的一个函数,返回一个数组。useEffect(function(),[]),别忘记第二个参数是空数组。1.AfirstlookatREACT以前网页由服务端渲染->SPAWebApplications数据的同步更新很重要!React是什么?JavaScriptReviewArrayMethodsarr=[3,1,6,2,9],arr.sort......
  • ESXI软路由、H3C小贝系列AC实现普通上网和旁路由上网双WIFI
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总......
  • 前端经典面试合集(二)——Vue/React/Node/工程化工具/计算机网络
    1.说说Vue中的Diff算法Vue的Diff算法主要用于优化虚拟DOM和实际DOM之间的比较过程。它通过以下几种策略来提高性能:最小化对DOM的操作:Vue通过在内存中构建一个虚拟DOM树,在虚拟DOM树与真实DOM树之间进行比较和更新,这样就避免了频繁的直接操作DOM,提高......
  • 华为-eNSP-静态路由知识点与基本配置
    什么是静态路由?  静态路由是一种网络路由方式,其路由信息是由网络管理员手动配置的,而不是通过动态路由协议自动学习的。静态路由是固定的,不会随着网络状态的变化而变化,这种路由方式适用于网络拓扑结构简单且稳定的环境,尤其是在中小型网络中较为常见。静态路由的优点和缺点......
  • vue3入门教程:ref能否完全替代reactive?
    1.使用场景与数据类型ref:主要用于基本数据类型(如String、Number、Boolean等)。也可以用于对象/数组,但需要通过.value访问。适合单个响应式数据的管理。reactive:主要用于对象类型(如Object、Array)。直接访问属性,不需要.value。适合多个响应式数据的管理。2.访问方式......
  • React—01—基本学习,如何在html中直接使用react;
     一、react的特点:   <script>标签这里要加一个“text/babel”,babel才知道这个<script>标签里要解析js代码,否则babel不会启动。     React组件是返回标签的JavaScript函数: 哪个组件是通过改变state实现可响应的,或者哪个组件拥有 这个state。......
  • 路由器获取网段的方法1 静态路由
    静态路由:尤管理员手写的路由条目静态路由:路由器与路由器之间的链路我们称之为骨干链路(总线链路),一般是不配置任何PC端的。  下一跳判断:1.方向正确  2.必须在直接连接的网段范围内[R1]iproute-static192.168.3.024192.168.2.2静态路由:目标网段为192.168.3.0/24......
  • vue嵌套路由和扁平路由(父、子路由)区别
    在VueRouter中,配置子路由(嵌套路由)与配置全部为父路由(扁平路由)有以下几个主要的区别和影响:vue2中src/router/index.js中配置router路由信息子路由(嵌套路由)组件结构:子路由通常用于创建嵌套的视图结构,例如,在一个页面内嵌套多个组件。父组件可以包含多个子组件,每个子组件都有自己......