Loading...
Loading...
Compare original and translation side by side
createBrowserRouterRouterProvidercreateBrowserRouterRouterProvidercreateBrowserRouterloaderaction<Link><NavLink><Form>redirectuseNavigateuseNavigationuseFetchercreateBrowserRouterloaderaction<Link><NavLink><Form>redirectuseNavigateuseNavigationuseFetcher| Reference | Use When |
|---|---|
| Configuring routes, nested routes, layout |
| Understanding route object properties |
| Loading data with loaders |
| Handling forms, mutations, validation |
| Links, programmatic navigation, redirects |
| Loading states, optimistic UI |
| Server-side rendering with data mode |
| 参考文档 | 适用场景 |
|---|---|
| 配置路由、嵌套路由、布局 |
| 理解路由对象属性 |
| 使用loaders加载数据 |
| 处理表单、数据变更、验证 |
| 链接、编程式导航、重定向 |
| 加载状态、乐观UI |
| 结合Data Mode实现服务端渲染 |
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} />);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">onSubmitsetSearchParams// ✅ Correct
<Form method="get">
<input name="q" />
</Form>
// ❌ Wrong - don't manually handle search params
<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<Form method="get">setSearchParamsonSubmit// ✅ 正确
<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.mdfetcher.formDatafunction 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>
);
}references/pending-ui.mdfetcher.formDatafunction 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