react-router-data-mode by remix-run/agent-skills
npx skills add https://github.com/remix-run/agent-skills --skill react-router-data-mode数据模式使用 createBrowserRouter 和 RouterProvider 来实现数据加载、操作和待处理 UI,而无需框架的 Vite 插件。这对于希望添加数据加载和变更功能的现有 React 应用程序来说是理想选择。
createBrowserRouter 与路由对象结合使用loader 属性加载数据action 属性处理变更操作<Link>、<NavLink>、<Form>、redirect 和 进行导航广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
useNavigateuseNavigation 实现待处理/加载 UI 状态useFetcher 进行无需导航的变更操作加载相关参考资料以获取特定 API/概念的详细指导:
| 参考资料 | 适用场景 |
|---|---|
references/routing.md | 配置路由、嵌套路由、布局 |
references/route-object.md | 理解路由对象属性 |
references/data-loading.md | 使用加载器加载数据 |
references/actions.md | 处理表单、变更、验证 |
references/navigation.md | 链接、编程式导航、重定向 |
references/pending-ui.md | 加载状态、乐观 UI |
references/ssr.md | 数据模式的服务器端渲染 |
这些是最重要的需要遵循的模式。加载相关参考资料以获取完整详情。
import { createBrowserRouter, RouterProvider } from "react-router";
const router = createBrowserRouter([
{
path: "/",
Component: Root,
children: [
{ index: true, Component: Home },
{ path: "about", Component: About },
],
},
]);
ReactDOM.createRoot(root).render(<RouterProvider router={router} />);
搜索表单 - 使用 <Form method="get">,而不是带有 setSearchParams 的 onSubmit:
// ✅ 正确
<Form method="get">
<input name="q" />
</Form>
// ❌ 错误 - 不要手动处理搜索参数
<form onSubmit={(e) => { e.preventDefault(); setSearchParams(...) }}>
内联变更 - 使用 useFetcher,而不是 <Form>(后者会导致页面导航):
const fetcher = useFetcher();
const optimistic = fetcher.formData
? fetcher.formData.get("favorite") === "true"
: isFavorite;
<fetcher.Form method="post" action={`/favorites/${id}`}>
<button>{optimistic ? "★" : "☆"}</button>
</fetcher.Form>;
完整模式请参阅 references/actions.md。
使用 fetcher.formData 立即显示预期结果:
function FavoriteButton({ itemId, isFavorite }) {
const fetcher = useFetcher();
// 乐观更新:使用待处理的表单数据,回退到服务器状态
const optimistic = fetcher.formData
? fetcher.formData.get("favorite") === "true"
: isFavorite;
return (
<fetcher.Form method="post" action={`/items/${itemId}/favorite`}>
<input type="hidden" name="favorite" value={String(!optimistic)} />
<button>{optimistic ? "★" : "☆"}</button>
</fetcher.Form>
);
}
完整模式请参阅 references/pending-ui.md。
如果这些参考资料未涵盖任何与 React Router 相关的内容,您可以搜索官方文档:
每周安装量
215
代码仓库
GitHub 星标数
104
首次出现
2026年2月2日
安全审计
安装于
codex191
opencode190
github-copilot171
gemini-cli166
amp160
kimi-cli159
Data mode uses createBrowserRouter and RouterProvider to enable data loading, actions, and pending UI without the framework's Vite plugin. This is ideal for existing React applications that want to add data loading and mutation capabilities.
createBrowserRouter with route objectsloader property on routesaction property<Link>, <NavLink>, <Form>, redirect, and useNavigateuseNavigationuseFetcher for mutations without navigationLoad the relevant reference for detailed guidance on the specific API/concept:
| Reference | Use When |
|---|---|
references/routing.md | Configuring routes, nested routes, layout |
references/route-object.md | Understanding route object properties |
references/data-loading.md | Loading data with loaders |
references/actions.md | Handling forms, mutations, validation |
references/navigation.md | Links, programmatic navigation, redirects |
references/pending-ui.md |
These are the most important patterns to follow. Load the relevant reference for full details.
import { createBrowserRouter, RouterProvider } from "react-router";
const router = createBrowserRouter([
{
path: "/",
Component: Root,
children: [
{ index: true, Component: Home },
{ path: "about", Component: About },
],
},
]);
ReactDOM.createRoot(root).render(<RouterProvider router={router} />);
Search forms - use <Form method="get">, NOT onSubmit with setSearchParams:
// ✅ Correct
<Form method="get">
<input name="q" />
</Form>
// ❌ Wrong - don't manually handle search params
<form onSubmit={(e) => { e.preventDefault(); setSearchParams(...) }}>
Inline mutations - use useFetcher, NOT <Form> (which causes page navigation):
const fetcher = useFetcher();
const optimistic = fetcher.formData
? fetcher.formData.get("favorite") === "true"
: isFavorite;
<fetcher.Form method="post" action={`/favorites/${id}`}>
<button>{optimistic ? "★" : "☆"}</button>
</fetcher.Form>;
See references/actions.md for complete patterns.
Use fetcher.formData to show expected results immediately:
function FavoriteButton({ itemId, isFavorite }) {
const fetcher = useFetcher();
// Optimistic: use pending form data, fallback to server state
const optimistic = fetcher.formData
? fetcher.formData.get("favorite") === "true"
: isFavorite;
return (
<fetcher.Form method="post" action={`/items/${itemId}/favorite`}>
<input type="hidden" name="favorite" value={String(!optimistic)} />
<button>{optimistic ? "★" : "☆"}</button>
</fetcher.Form>
);
}
See references/pending-ui.md for complete patterns.
If anything related to React Router is not covered in these references, you can search the official documentation:
Weekly Installs
215
Repository
GitHub Stars
104
First Seen
Feb 2, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex191
opencode190
github-copilot171
gemini-cli166
amp160
kimi-cli159
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
111,800 周安装
房地产专家系统:MLS集成、虚拟看房、AI估值与物业管理技术解决方案
206 周安装
TypeScript/JavaScript 开发技能 - 掌握 Metabase 开源项目开发流程与工具
206 周安装
Upstash Redis SDK 完整指南 - Redis-JS 安装、使用与性能优化教程
206 周安装
Tavily API 网络搜索技能 - 实现网页爬取、内容提取和智能研究功能
206 周安装
企业合规助手:GDPR、CCPA等隐私法规合规指南与数据处理协议审查清单
206 周安装
DeepSpeed 开发助手:官方文档指南、API 使用与性能优化教程
207 周安装
| Loading states, optimistic UI |
references/ssr.md | Server-side rendering with data mode |