remix 路由分类
- 根路由 root.tsx
- 页面路由(基础路由)routes
- 带有参数页面路由(动态路由)
- 可选分段路由 (处理不同分段)
- 布局路由(非页面路由,处理布局,与 Outlet 组件结合)
- 点分割路由(简化文件夹深度)
- Splat 路由(特定匹配)
- 路由转义字符串
路由约定,使用 .点路由分割符号的方式,不再支持文件夹嵌套的模式
- index 文件路由改为 _index 路由
- 布局路由使用 _ 下划线开始
- ~ 波浪线代表 app 目录
- react-router API 全部从 @remix-run/react 获取
- loader 不能访问 window 属性,不能有 jsx ```tsx import { useLocation, useLoaderData, Link } from “@remix-run/react”;
export async function loader({ params }) { return await getUsers(); }
export default function Page() { const data = useLoaderData(); }
![image.png](https://cdn.nlark.com/yuque/0/2024/png/112859/1705137251290-8492cd94-9288-4ed2-bdc3-47cea3bc931c.png#averageHue=%236c837f&clientId=u53eb9e60-1f33-4&from=paste&height=251&id=uc82f6914&originHeight=552&originWidth=1312&originalType=binary&ratio=2.200000047683716&rotation=0&showTitle=false&size=430909&status=done&style=none&taskId=uf1a59a02-9b53-4530-9172-45c27116a6b&title=&width=596.363623437803)
<a name="U2OI0"></a>
## 前后端一体化
前端后端的代码都可以写在一个文件中,逻辑更加内聚
- loader、action 会运行在 Server 上
- meta、links 会运行在浏览器上
- export default 导出的组件在浏览器和 Server 上都会运行 SSR
![image.png](https://cdn.nlark.com/yuque/0/2024/png/112859/1706879551263-145876b6-ffd2-4257-aca1-48f64cc9fca0.png#averageHue=%23151412&clientId=u7ac2ed71-f3e9-4&from=paste&height=391&id=u7cd9c452&originHeight=860&originWidth=1232&originalType=binary&ratio=2.200000047683716&rotation=0&showTitle=false&size=100300&status=done&style=none&taskId=u8139764b-f622-4bc1-8989-eace6935652&title=&width=559.9999878623271)
```tsx
import type {
MetaFunction,
LinksFunction,
LoaderFunction
} from '@remix-run/node'
import stylesUrl from "~/styles/index.css";
/**
* 每个页面组件中,直接声明 head 中的信息
* 可以获取 loader中的 data
*/
export const meta: MetaFunction = ({ data }) => {
return [
{
title: "Remix: It's funny!",
description: "Remix Remix Remix",
}
];
};
/*
* 声明依赖的资源文件
* <link />
*/
export const links: LinksFunction = () => {
return [{ rel: "stylesheet", href: stylesUrl }];
};
/*
* Server 服务端代码,负责数据获取
* 执行 SQL,Redis的操作,组件使用 useLoaderData() 获取数据
*/
export const loader: LoaderFunction = async ({ request }) => {
const res = await db.getData(request);
return json(res);
}
/*
* 负责修改数据,data mutation
*/
export const action = async ({ request }) => {
const res = await db.setData(request);
return json(res);
}
// React 组件
export default function IndexPage() {
const data = useLoaderData();
return (
<div>
React 组件
</div>
)
}