useOutletContext
Often parent routes manage state or other values you want shared with child routes. You can create your own context provider if you like, but this is such a common situation that it's built-into <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>; }
If you're using TypeScript, we recommend the parent component provide a custom hook for accessing the context value. This makes it easier for consumers to get nice typings, control consumers, and know who's consuming the context value. Here's a more realistic example:
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 }} /> </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> ); }
© React Training 2015-2019
© Remix Software 2020-2022
Licensed under the MIT License (MIT).
https://reactrouterdotcom.fly.dev/docs/en/v6/hooks/use-outlet-context