导航
在本页

导航

用户使用 <Link><NavLink><Form>redirectuseNavigate 在你的应用程序中导航。

此组件用于需要渲染活动和待定状态的导航链接。

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 */
}

它还在 classNamestylechildren 上具有回调属性,用于内联样式设置或条件渲染

// 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>
  );
}

Form

表单组件可用于使用用户提供的 URLSearchParams 进行导航。

<Form action="/search">
  <input type="text" name="q" />
</Form>

如果用户在输入框中输入 “journey” 并提交,他们将导航到

/search?q=journey

带有 <Form method="post" /> 的表单也会导航到 action 属性,但会将数据作为 FormData 而不是 URLSearchParams 提交。但是,更常见的是使用 useFetcher() 来 POST 表单数据。请参阅 使用 Fetchers

redirect

在路由加载器和操作内部,你可以返回一个 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}`);
}

useNavigate

此 Hook 允许程序员在用户不交互的情况下将用户导航到新页面。此 Hook 的使用应该不常见。建议尽可能使用本指南中的其他 API。

useNavigate 的使用保留在用户 *不* 交互但你需要导航的情况下,例如

  • 在不活动后注销他们
  • 定时 UI,如测验等。
import { useNavigate } from "react-router";

export function useLogoutAfterInactivity() {
  let navigate = useNavigate();

  useFakeInactivityHook(() => {
    navigate("/logout");
  });
}

下一步:待定 UI

文档和示例 CC 4.0