用户使用 <Link>
、<NavLink>
、<Form>
、redirect
和 useNavigate
在你的应用程序中导航。
此组件用于需要渲染活动和待定状态的导航链接。
import { NavLink } from "react-router";
export function MyAppNav() {
return (
<nav>
<NavLink to="/" end>
Home
</NavLink>
<NavLink to="/trending" end>
Trending Concerts
</NavLink>
<NavLink to="/concerts">All Concerts</NavLink>
<NavLink to="/account">Account</NavLink>
</nav>
);
}
NavLink
为不同状态渲染默认类名,以便于使用 CSS 进行样式设置
a.active {
color: red;
}
a.pending {
animate: pulse 1s infinite;
}
a.transitioning {
/* css transition is running */
}
它还在 className
、style
和 children
上具有回调属性,用于内联样式设置或条件渲染
// className
<NavLink
to="/messages"
className={({ isActive, isPending, isTransitioning }) =>
[
isPending ? "pending" : "",
isActive ? "active" : "",
isTransitioning ? "transitioning" : "",
].join(" ")
}
>
Messages
</NavLink>
// style
<NavLink
to="/messages"
style={({ isActive, isPending, isTransitioning }) => {
return {
fontWeight: isActive ? "bold" : "",
color: isPending ? "red" : "black",
viewTransitionName: isTransitioning ? "slide" : "",
};
}}
>
Messages
</NavLink>
// children
<NavLink to="/tasks">
{({ isActive, isPending, isTransitioning }) => (
<span className={isActive ? "active" : ""}>Tasks</span>
)}
</NavLink>
当链接不需要活动样式时,请使用 <Link>
import { Link } from "react-router";
export function LoggedOutMessage() {
return (
<p>
You've been logged out.{" "}
<Link to="/login">Login again</Link>
</p>
);
}
表单组件可用于使用用户提供的 URLSearchParams
进行导航。
<Form action="/search">
<input type="text" name="q" />
</Form>
如果用户在输入框中输入 “journey” 并提交,他们将导航到
/search?q=journey
带有 <Form method="post" />
的表单也会导航到 action 属性,但会将数据作为 FormData
而不是 URLSearchParams
提交。但是,更常见的是使用 useFetcher()
来 POST 表单数据。请参阅 使用 Fetchers。
在路由加载器和操作内部,你可以返回一个 redirect
到另一个 URL。
import { redirect } from "react-router";
export async function loader({ request }) {
let user = await getUser(request);
if (!user) {
return redirect("/login");
}
return { userName: user.name };
}
在创建新记录后,通常会重定向到新记录
import { redirect } from "react-router";
export async function action({ request }) {
let formData = await request.formData();
let project = await createProject(formData);
return redirect(`/projects/${project.id}`);
}
此 Hook 允许程序员在用户不交互的情况下将用户导航到新页面。此 Hook 的使用应该不常见。建议尽可能使用本指南中的其他 API。
将 useNavigate
的使用保留在用户 *不* 交互但你需要导航的情况下,例如
import { useNavigate } from "react-router";
export function useLogoutAfterInactivity() {
let navigate = useNavigate();
useFakeInactivityHook(() => {
navigate("/logout");
});
}
下一步:待定 UI