主要
分支
主要 (6.23.1)開發中
版本
6.23.1v4/5.xv3.x
useOutletContext

useOutletContext

類別聲明
declare function useOutletContext<
  Context = unknown
>(): Context;

通常父級路由會管理狀態或你想要與子路由共用的其他值。你可以建立自己的 內容提供器(如果你喜歡);但這是一個如此常見的狀況,Remix 已將其內建至 <Outlet />

function Parent() {
  const [count, setCount] = React.useState(0);
  return <Outlet context={[count, setCount]} />;
}
import { useOutletContext } from "react-router-dom";

function Child() {
  const [count, setCount] = useOutletContext();
  const increment = () => setCount((c) => c + 1);
  return <button onClick={increment}>{count}</button>;
}

如果你使用 TypeScript,我們建議父元件提供一個自訂掛勾來存取內容值。這可協助消費者取得精確的型別,控制消費者,並知道誰正在消耗內容值。以下是一個更實際的範例

import * as React from "react";
import type { User } from "./types";
import { Outlet, useOutletContext } from "react-router-dom";

type ContextType = { user: User | null };

export default function Dashboard() {
  const [user, setUser] = React.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>
  );
}