返回父路由的 <Outlet context>
。
父路由通常管理您希望与子路由共享的状态或其他值。您可以根据需要创建自己的 context provider,但这种情况非常普遍,因此它已内置于 <Outlet>
中。
// Parent route
function Parent() {
const [count, setCount] = React.useState(0);
return <Outlet context={[count, setCount]} />;
}
// Child route
import { useOutletContext } from "react-router";
function Child() {
const [count, setCount] = useOutletContext();
const increment = () => setCount((c) => c + 1);
return <button onClick={increment}>{count}</button>;
}
如果您正在使用 TypeScript,我们建议父组件提供一个自定义钩子来访问上下文值。这使得消费者更容易获得良好的类型定义、控制消费者以及了解谁在消费上下文值。
下面是一个更真实的例子
import { useState } from "react";
import { Outlet, useOutletContext } from "react-router";
import type { User } from "./types";
type ContextType = { user: User | null };
export default function Dashboard() {
const [user, setUser] = useState<User | null>(null);
return (
<div>
<h1>Dashboard</h1>
<Outlet context={{ user } satisfies ContextType} />
</div>
);
}
export function useUser() {
return useOutletContext<ContextType>();
}
import { useUser } from "../dashboard";
export default function DashboardMessages() {
const { user } = useUser();
return (
<div>
<h2>Messages</h2>
<p>Hello, {user.name}!</p>
</div>
);
}
function useOutletContext<Context = unknown>(): Context
传递给父 Outlet
组件的上下文值