React18入门(第五篇)——React Router详细使用教程

概述

十分钟带你理解 React18项目如何在路由跳转时携带参数,如何获取路由地址中携带的参数。

文章目录

一、定义路由表

1.1 装包
bash 复制代码
npm install react-router-dom --save
1.2 定义路由文件
javascript 复制代码
import React from 'react'
// 关键代码
import { createBrowserRouter } from 'react-router-dom'

// 引入组件,没啥好说的
import MainLayout from '../pages/layouts/MainLayout'
import ManageLayout from '../pages/layouts/ManageLayout'
import QuestionLayout from '../pages/layouts/QuestionLayout'
import Home from '../pages/Home'
import NotFond from '../pages/NotFound'
import List from '../pages/manage/List'
import Edit from '../pages/question/Edit'

// 写法与 Vue.js 类似
const router = createBrowserRouter([
  {
    path: '/',
    element: <MainLayout />,
    children: [
      {
        path: '/',
        element: <Home />,
      },
      {
        path: 'manage',
        element: <ManageLayout />,
        children: [
          {
            path: 'list',
            element: <List />,
          },
        ],
      },
      {
        path: '*', // 404 路由配置都写在最后,起到一个兜底的作用
        element: <NotFond />,
      },
    ],
  },
  {
    path: 'question',
    element: <QuestionLayout />,
    children: [
      {
        path: 'edit/:id',
        element: <Edit />,
      },
    ],
  },
])
export default router

二、路由跳转

2.1 跳转到某个地址
javascript 复制代码
import React, { FC } from 'react'
import { useNavigate, Link } from 'react-router-dom'

const Home: FC = () => {
  const nav = useNavigate()
  // 点击登录
  function handleLogin() {
    /** 方式一:*/
    // nav('/login')  || nav('/login?a=10')
    
    /** 方式二:*/
    nav({
      pathname: '/login',
      search: 'b=20',
    })
  }
  return (
    <div>
       // 方式一:
      <button onClick={handleLogin}>登录</button>
       // 方式二:
      <Link to="/register?a=10">注册</Link>
    </div>
  )
}
export default Home
2.2 路由返回
javascript 复制代码
import React, { FC } from 'react'
import { useNavigate } from 'react-router-dom'

const Login: FC = () => {
  const nav = useNavigate()
  return (
    <div>
      {/* nav(-1) -- 路由跳转后可以实现返回 */}
      <button onClick={() => nav(-1)}>返回</button>
    </div>
  )
}
export default Login

三、如何获取路由参数

3.1 解析动态路由参数

路由定义时,使用动态路由:

js 复制代码
{
  path: 'question',
  element: <QuestionLayout />,
  children: [
    {
      path: 'edit/:id',
      element: <Edit />,
    },
  ],
},

获取路由传参:

javascript 复制代码
import React, { FC } from 'react'
// 核心代码
import { useParams } from 'react-router-dom'

const Edit: FC = () => {
  // 拿到路由传参
  const { id = '' } = useParams()
  return (
    <div>
      <div>{id}</div>
    </div>
  )
}
export default Edit
3.2 解析URL参数
javascript 复制代码
import React, { FC, useState } from 'react'
// 核心代码
import { useSearchParams } from 'react-router-dom'

const List: FC = () => {
  // 核心代码
  const [searchParams] = useSearchParams()
  console.log('key word', searchParams.get('keyword'))
  return (
    <>
      ...其他代码
    </>
  )
}
export default List
相关推荐
前端摸鱼匠1 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker1 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding3 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马3 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren3 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川3 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
jinanwuhuaguo3 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw
广州华水科技3 小时前
深度测评2026年单北斗GNSS位移监测系统推荐,与高口碑变形监测设备一同引领行业新风尚
前端
Alice-YUE4 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript