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

从手写 Hash 路由到 React Router:一个路由练习的关键实现

从手写 Hash 路由到 React Router:一个路由练习的关键实现

前端路由的目标是在单页应用中根据 URL 切换页面组件,而不按传统多页应用方式重新请求整份 HTML。本练习基于 React、Vite 和react-router-dom,集中实现了基础路由、动态参数、嵌套路由、404 与路由级懒加载。

本文依据本地代码静态分析整理,运行未验证。

1. 用 Router 接管页面切换

入口路由在App.jsx

<Router> <Suspense fallback={<div>Loading...</div>}> <Navigation /> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="/user/:id" element={<UserProfile />} /> <Route path="*" element={<NotFound />} /> </Routes> </Suspense> </Router>

项目将HashRouter别名为Router。它使用#后的路径管理前端状态,例如#/aboutRoutes负责匹配,Route描述“路径对应哪个组件”。

导航栏用Link

<Link to="/about">About</Link>

Link让 React Router 处理跳转,适用于 SPA 路由切换。

2. 路由级懒加载:首屏不必下载全部页面

页面不是普通静态导入,而是:

const Home = lazy(() => import('./pages/Home')) const Products = lazy(() => import('./pages/Products'))

lazy + import()实现代码分割:访问页面时才加载对应模块。由于异步加载需要等待时间,外层必须由Suspense包裹并显示加载占位。

这适合管理后台、图表、编辑器或访问频率低的页面;不应把每个很小且高频的组件都拆分成独立包。

3. 动态参数:同一页面处理不同资源

用户页规则:

<Route path="/user/:id" element={<UserProfile />} />

访问/user/123后:

const { id } = useParams()

可得到字符串'123'。产品详情使用相同模式读取:productId

真实业务中,参数通常用于请求详情接口,并应处理参数格式校验、加载状态和接口异常。

4. 嵌套路由:共享布局与子页面出口

产品模块:

<Route path="/products" element={<Products />}> <Route path=":productId" element={<ProductDetail />} /> <Route path="new" element={<ProductNew />} /> </Route>

父组件提供:

<Outlet />

当访问/products/123时,Products先渲染共享标题,ProductDetail再渲染到Outlet位置。该模式适合共享侧栏、Tab、权限逻辑的业务模块。

5. 404、重定向与编程式跳转

未知地址由通配符兜底:

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

404 页通过useNavigate在逻辑中跳转:

const navigate = useNavigate() navigate('/')

Navigate用于声明式重定向:

<Route path="/old-path" element={<Navigate to="/new-path" />} />

两个代码审查点

  1. /new-path未见对应路由配置,按当前代码推断会进入 404;需要补充目标路由或修改跳转目标。
  2. 404 页创建了 3 秒定时器但没有清理。建议在useEffect中返回clearTimeout(timer),避免组件提前卸载后仍触发跳转。

6. 小结

这个练习覆盖了 React Router 的主干能力:

  • HashRouter提供路由上下文;
  • RoutesRoute描述路径与页面;
  • Link用于导航;
  • lazy + Suspense用于按需加载;
  • useParams读取动态参数;
  • Outlet承载嵌套路由;
  • NavigateuseNavigate分别处理声明式与编程式跳转;
  • path="*"负责 404 兜底。

面试中可以总结为:我完成了一个 React SPA 路由练习,并在基础路由之上补充了页面级代码分割、动态参数和嵌套路由;同时关注到重定向目标必须存在、异步副作用必须清理等可靠性问题。

http://www.jsqmd.com/news/1336662/

相关文章:

  • 74. 搜索二维矩阵:把二维结构映射成一维后做二分
  • ENVI 5.6安装与配置全攻略:从系统环境到性能优化的遥感数据处理基石
  • 如何轻松捕获网页视频:猫抓浏览器扩展终极使用指南
  • tchMaterial-parser架构解析:国家中小学智慧教育平台电子课本下载技术实现深度指南
  • 全屋一体式家用冷暖系统什么牌子好:【芬尼】一体集成 - 18002239949
  • 终极指南:如何为AMD 780M APU和更多GPU安装优化ROCm库,实现2-3倍AI性能提升
  • 大模型本地部署:端侧 LLM/VLM 实现机械臂自然语言指令控制
  • 技术管理者如何修炼战略敏捷能力:从概念到实践
  • Python对象字符串表示:__str__与__repr__方法详解与实践
  • Inmon数据仓库
  • PyTorch DataLoader中collate_fn的作用与自定义实践
  • 智慧场馆综合管理系统定制,门店营收会员数据分析
  • Bebas Neue字体完全指南:免费商用的现代标题字体之王
  • 华为MetaERP Oracle EBS R12 PA 与 Oracle Fusion Project Financial Management(含 Project Costing + Project
  • 苹果开发者账号开通流程图与完整指南
  • 泰州母婴除甲醛公司甲醛检测测评推荐:康之居母婴除甲醛标准、流程、避坑指南 - CMA甲醛检测中心
  • KaTrain围棋AI训练平台:12种AI策略深度解析与实战指南
  • 维吉尼亚密码实战破解:从卡西斯基试验到频率分析
  • Unity高性能3D模型加载:glTFast核心原理、实战与优化指南
  • 以前3人巡塘累断腰,一台手机搞定喂养!智慧养鱼就在物联网流量上!
  • OpenClaw与Qwen-Max用量监控与优化实践
  • DLSS Swapper实战指南:3分钟掌握游戏性能自由切换
  • 基于ffmpeg,实现对yuv格式的视频及pcm格式的音频数据编码
  • 揭秘asp网站建设 文献中的那些被忽视的技术细节与实战心得
  • Linux下CANFD与经典CAN配置实战:从SocketCAN驱动到数据收发调试
  • HarmonyOS 7 / API 26 折叠屏适配实战:窗口断点、双栏切换和状态保留一次验清
  • 2026.7.13(5)【图片隐写】镜子里面的世界
  • 唐山母婴除甲醛公司甲醛检测测评推荐:康之居母婴除甲醛标准、流程、避坑指南 - CMA甲醛检测中心
  • 从ISO到可运行系统:详解操作系统安装全流程与避坑指南
  • 跨境卖家必看:批量图片翻译与视频字幕翻译工具推荐