当前位置:首页 > 技术 > 正文内容

React Router 实战指南:从基础配置到参数传递

访客 技术 2026年9月14日 9

路由模式选型

react-router-dom 提供两种路由容器,需根据部署环境选择:

特性HashRouterBrowserRouter
实现原理location.hash 变化history.pushState API
URL 形态/#/user/profile/user/profile
服务器配置无需处理需配置 fallback
本地文件访问正常渲染刷新 404

构建静态站点或需要直接打开 HTML 文件时,优先选用 HashRouter。

import { HashRouter } from 'react-router-dom'
import { createRoot } from 'react-dom/client'
import Root from './Root'

const container = document.getElementById('app')
createRoot(container).render(
  <HashRouter>
    <Root />
  </HashRouter>
)

定义路由映射

Switch 组件确保仅渲染首个匹配项,避免多路由同时激活:

import { Switch, Route, Redirect } from 'react-router-dom'
import Dashboard from './pages/Dashboard'
import Settings from './pages/Settings'
import NotFound from './pages/NotFound'

function Routes() {
  return (
    <Switch>
      <Route exact path="/dashboard" component={Dashboard} />
      <Route path="/settings" component={Settings} />
      <Redirect from="/" to="/dashboard" exact />
      <Route component={NotFound} />
    </Switch>
  )
}

声明式导航

NavLink 支持 active 状态样式,适合导航菜单:

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

function Sidebar() {
  const navClass = ({ isActive }) => 
    isActive ? 'nav-item active' : 'nav-item'
  
  return (
    <nav>
      <NavLink to="/dashboard" className={navClass}>
        控制台
      </NavLink>
      <NavLink to="/settings/security" className={navClass}>
        安全设置
      </NavLink>
    </nav>
  )
}

四种参数传递方案

方案一:动态路径参数

适用于标识资源的唯一 ID,参数可见且持久:

// 路由声明
<Route path="/article/:postId/:slug" component={Article} />

// 链接跳转
<Link to={`/article/${item.id}/${item.slug}`}>{item.title}</Link>

// 组件内读取
const Article = ({ match }) => {
  const { postId, slug } = match.params
  return <div>文章 {postId}</div>
}

// 编程式导航
history.push(`/article/${id}/${slug}`)

方案二:URL 查询字符串

适合筛选条件、分页等场景:

// 路由无需特殊声明
<Route path="/search" component={SearchResult} />

// 构造查询参数
const query = new URLSearchParams()
query.append('keyword', keyword)
query.append('page', page)

<Link to={`/search?${query.toString()}`}>搜索</Link>

// 组件解析
import { useLocation } from 'react-router-dom'

const SearchResult = () => {
  const location = useLocation()
  const params = new URLSearchParams(location.search)
  const keyword = params.get('keyword')
  const page = params.get('page')
}

方案三:隐式状态传递

数据不暴露于 URL,BrowserRouter 下刷新保留:

// 声明式
<Link 
  to={{
    pathname: '/checkout',
    state: { fromCart: true, items: cartItems }
  }}
>
  去结算
</Link>

// 编程式
history.replace('/checkout', { fromCart: true, items })

// 组件接收
const Checkout = ({ location }) => {
  const { fromCart, items } = location.state || {}
}

方案四:内存状态(已废弃)

早期版本的 query 对象传参,现已被 state 取代,不建议在新项目中使用。

非路由组件接入导航能力

withRouter 高阶组件为普通组件注入路由上下文:

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

function Toolbar({ history, location, match }) {
  const handleBack = () => history.goBack()
  const handleForward = () => history.goForward()
  const jumpTo = (steps) => history.go(steps)
  
  return (
    <div className="toolbar">
      <button onClick={handleBack}>← 后退</button>
      <button onClick={handleForward}>前进 →</button>
      <button onClick={() => jumpTo(-2)}>返回两步</button>
    </div>
  )
}

export default withRouter(Toolbar)

选型建议

  • 动态路径:资源定位明确,SEO 友好
  • 查询参数:筛选、排序等临时状态
  • state 传值:敏感数据或复杂对象传递

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。