定义路由
上一章节中,我们已经安装了插件并定义了我们的第一个路由,让我们看看如何在应用程序中定义不同类型的路由。如果你熟悉 Remix-flat-routes 约定,可以跳过此页面并进入下一章节。
由于 vite-plugin-remix-routes
是基于 react-router
构建的,你需要熟悉 react-router
的基本概念才能完全理解如何使用此插件。你可以在他们的官方文档中找到更多关于 react-router
的信息。
基础路由
正如我们在定义你的第一个路由中看到的那样,要定义一个基本路由,我们只需在 routes
目录中创建一个文件。文件名将用作路由路径。每个路由文件都应该导出一个 React 组件,当路由匹配时将渲染该组件。
让我们创建一个名为 about
的新路由:
$ touch app/routes/about.tsx
现在让我们定义路由组件:
// app/routes/about.tsx
export default function About() {
return <h1>About</h1>
}
现在,如果我们在浏览器中访问 /about
,我们应该看到 About
组件。
嵌套路由
要定义嵌套路由,我们可以在 routes
目录中创建一个带有路由名称的目录。让我们为 /users/profile
创建一个新路由:
// app/routes/users+/profile.tsx
export default function Profile() {
return <h1>Profile</h1>
}
现在,如果我们在浏览器中导航到 /users/profile
,我们将看到 Profile
页面。
动态路由
要创建动态路由,我们需要在 routes
目录中创建一个以 $
开头的文件名。假设我们需要一个匹配 /users/:id
的路由,我们可以在 routes/users
目录中创建一个名为 $id.tsx
的文件:
// app/routes/users+/$id.tsx
import { useParams } from 'react-router-dom'
export function Component() {
const { id } = useParams()
return <h1>User ID: {id}</h1>
}
现在,如果我们在浏览器中导航到 /users/1
,我们将看到 User ID: 1
页面。
索引路由
索引路由是一个特殊的路由,它是一个目录的默认路由。例如,/users
路由是 routes/users/index.tsx
的默认路由。你可以在 routes
目录中创建一个名为 index.tsx
的文件来定义索引路由。
// app/routes/users+/index.tsx
export default function Users() {
return <h1>Users</h1>
}
现在,如果我们在浏览器中导航到 /users
,我们将看到 Users
页面。
路由Layout
routes
目录中的每个子目录都可以有一个Layout。要为一个目录定义Layout,我们可以在该目录中创建一个 _layout
文件。例如,要为 routes/users+
目录定义Layout,我们在 users+
目录中创建一个名为 _layout
的文件:
// app/routes/users+/_layout.tsx
import { Outlet } from 'react-router-dom'
export function Component() {
return (
<div>
<h1>Users Layout</h1>
<Outlet />
</div>
)
}
请记住,Layout组件中需要使用 Outlet
或者 useOuelet
组件来渲染子路由。
懒加载路由
为了保持应用程序包的小巧并支持路由的代码拆分,你可以定义懒加载路由。路由文件的 default export
是一个懒加载的路由。
export default function LazyRoute() {
return <h1>Lazy Route</h1>
}
如果你想定义一个非懒加载的路由,你可以使用命名的 Component
导出:
export function Component() {
return <h1>Non Lazy Route</h1>
}
Splat 路由
最后,要定义一个 splat 路由(也称为 catch-all 路由),我们可以创建一个名为 $.tsx
的文件。
// routes/$.tsx
export function Component() {
return <h1>404</h1>
}
现在如果我们访问一个不存在的路由,我们将看到 404
页面。