2026/4/4 11:57:11
网站建设
项目流程
wordpress文章id不连续,seo沈阳,有哪些购物的网站,网络营销案例2020在开发企业级后台管理系统#xff08;Admin Dashboard#xff09;时#xff0c; “左侧固定菜单 右侧动态内容” 是最经典的布局模式。同时#xff0c;我们通常还需要一个独立的登录页面#xff0c;它不包含菜单栏#xff0c;而是全屏显示。在使用 TanStack Router 这种…在开发企业级后台管理系统Admin Dashboard时“左侧固定菜单 右侧动态内容”是最经典的布局模式。同时我们通常还需要一个独立的登录页面它不包含菜单栏而是全屏显示。在使用TanStack Router这种基于文件系统的路由库时如何优雅地实现这两种截然不同的布局共存且保持 URL 简洁例如访问/users而不是/admin/users答案就是使用无路径布局路由 (Pathless Layout Route)。本文将带你一步步落地这个架构。1. 核心概念什么是无路径布局在 TanStack Router 中如果你希望创建一个“包裹器”组件比如包含侧边栏的 Layout但不希望它在 URL 中增加一层路径你需要在文件名加一个下划线前缀_。routes/admin.tsx: 会生成/admin/...的 URL 路径。routes/_layout.tsx:不会生成 URL 路径它只是一个逻辑上的包裹层。利用这个特性我们可以实现/login- 渲染独立的登录页。/- 渲染_layout(带菜单) - 渲染index(仪表盘)。/users- 渲染_layout(带菜单) - 渲染users(用户列表)。2. 推荐的文件结构这是实现该架构的最佳目录结构。请注意_layout文件夹的使用Plaintext体验AI代码助手代码解读复制代码src/ └── routes/ ├── __root.tsx # 根组件 (通常只放 Context/DevTools) ├── login.tsx # 独立的登录页 (无菜单) ├── _layout.tsx # ✨ 核心后台布局主文件 └── _layout/ # ✨ 核心布局内部的子页面目录 ├── index.tsx # 对应 URL: / (仪表盘) ├── users.tsx # 对应 URL: /users └── settings.tsx # 对应 URL: /settings⚠️ 必须注意如果你创建了src/routes/_layout/index.tsx请务必删除项目根目录下的src/routes/index.tsx否则会报“路由冲突”错误。3. 代码实现第一步编写布局容器 (src/routes/_layout.tsx)这是整个架构的骨架。我们需要在这里划分左右区域并放置Outlet /。TypeScript体验AI代码助手代码解读复制代码import { createFileRoute, Outlet, Link } from tanstack/react-router export const Route createFileRoute(/_layout)({ component: AdminLayout, }) function AdminLayout() { return ( div classNameflex h-screen w-full bg-gray-100 {/* --- 左侧侧边栏 --- */} aside classNamew-64 bg-gray-900 text-white flex flex-col shadow-lg div classNamep-6 text-xl font-bold border-b border-gray-800 Admin System /div nav classNameflex-1 p-4 space-y-2 MenuLink to/ label仪表盘 / MenuLink to/users label用户管理 / MenuLink to/settings label系统设置 / /nav /aside {/* --- 右侧内容区域 --- */} main classNameflex-1 flex flex-col overflow-hidden {/* 顶部通栏 (Header) */} header classNameh-16 bg-white shadow-sm flex items-center px-6 span classNametext-gray-500面包屑 / 顶部导航/span /header {/* 页面内容滚动区 */} div classNameflex-1 overflow-auto p-6 {/* ✨✨✨ 关键点子路由渲染出口 ✨✨✨ */} Outlet / /div /main /div ) } // 封装一个简单的菜单组件自动处理高亮 function MenuLink({ to, label }: { to: string; label: string }) { return ( Link to{to} classNameblock px-4 py-2 rounded transition-colors hover:bg-gray-800 // 激活时的样式 activeProps{{ className: bg-blue-600 text-white shadow }} // 首页路由需要精确匹配防止所有页面都高亮它 activeOptions{{ exact: to / }} {label} /Link ) }第二步编写子页面子页面文件放在src/routes/_layout/目录下。仪表盘 (src/routes/_layout/index.tsx)TypeScript体验AI代码助手代码解读复制代码import { createFileRoute } from tanstack/react-router // 注意参数必须匹配文件路径 export const Route createFileRoute(/_layout/)({ component: () ( div classNamebg-white p-8 rounded shadow h1 classNametext-2xl font-bold mb-4欢迎回来/h1 p这里是仪表盘的核心数据区域。/p /div ), })用户管理 (src/routes/_layout/users.tsx)TypeScript体验AI代码助手代码解读复制代码import { createFileRoute } from tanstack/react-router export const Route createFileRoute(/_layout/users)({ component: () div用户列表管理界面/div, })第三步独立的登录页 (src/routes/login.tsx)因为它不在_layout文件夹内所以它不会继承左侧菜单。TypeScript体验AI代码助手代码解读复制代码import { createFileRoute } from tanstack/react-router export const Route createFileRoute(/login)({ component: () ( div classNameh-screen w-full flex items-center justify-center bg-gray-200 div classNamep-10 bg-white rounded-lg shadow-xl h1 classNametext-2xl font-bold请登录/h1 {/* 登录表单... */} /div /div ), })4. 常见坑点与排查 (Troubleshooting)在搭建这套架构时90% 的开发者会遇到以下三个问题坑点一路由冲突 (Conflicting configuration paths)现象终端报错 Conflicting configuration paths were found for the following routes: /, /。原因你的旧文件 src/routes/index.tsx 和新文件 src/routes/_layout/index.tsx 都试图代表根路径 /。解决直接删除 src/routes/index.tsx。坑点二右侧一片空白现象能看到左侧菜单URL 也没错但右边内容区是空的。原因你忘记在 _layout.tsx 里写 了。解决在标签内部添加 组件。坑点三TS 爆红波浪线现象刚创建 _layout.tsx 时createFileRoute(/_layout) 处提示类型错误。原因TanStack Router 还没来得及生成类型定义。解决保存文件即使有错。等待终端显示生成完成。如果还没好按Cmd/Ctrl Shift P-TypeScript: Restart TS Server。5. 总结通过使用_layout.tsx(无路径布局)我们成功实现了结构清晰后台页面集中管理与登录页物理隔离。URL 简洁用户访问的是/users而非繁琐的/layout/users。开发高效配合Outlet /和自动高亮的Link /几分钟就能搭好骨架。这套方案是目前 TanStack Router 构建中后台系统的最佳实践。原文https://juejin.cn/post/7594051311647621129