Skip to content

Commit bb81ad6

Browse files
authored
fix(useOutlet): don't wrap in ContextProvider if no child route (#8484)
1 parent ab8118e commit bb81ad6

File tree

2 files changed

+108
-5
lines changed

2 files changed

+108
-5
lines changed

packages/react-router/__tests__/useOutlet-test.tsx

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,54 @@ describe("useOutlet", () => {
2828

2929
expect(renderer.toJSON()).toBeNull();
3030
});
31+
32+
it("renders the fallback", () => {
33+
function Home() {
34+
let outlet = useOutlet();
35+
return <div>{outlet ? "outlet" : "no outlet"}</div>;
36+
}
37+
38+
let renderer: TestRenderer.ReactTestRenderer;
39+
TestRenderer.act(() => {
40+
renderer = TestRenderer.create(
41+
<MemoryRouter initialEntries={["/home"]}>
42+
<Routes>
43+
<Route path="/home" element={<Home />} />
44+
</Routes>
45+
</MemoryRouter>
46+
);
47+
});
48+
49+
expect(renderer.toJSON()).toMatchInlineSnapshot(`
50+
<div>
51+
no outlet
52+
</div>
53+
`);
54+
});
55+
56+
it("renders the fallback with context provided", () => {
57+
function Home() {
58+
let outlet = useOutlet({ some: "context" });
59+
return <div>{outlet ? "outlet" : "no outlet"}</div>;
60+
}
61+
62+
let renderer: TestRenderer.ReactTestRenderer;
63+
TestRenderer.act(() => {
64+
renderer = TestRenderer.create(
65+
<MemoryRouter initialEntries={["/home"]}>
66+
<Routes>
67+
<Route path="/home" element={<Home />} />
68+
</Routes>
69+
</MemoryRouter>
70+
);
71+
});
72+
73+
expect(renderer.toJSON()).toMatchInlineSnapshot(`
74+
<div>
75+
no outlet
76+
</div>
77+
`);
78+
});
3179
});
3280

3381
describe("when there is a child route", () => {
@@ -55,9 +103,61 @@ describe("useOutlet", () => {
55103
</h1>
56104
`);
57105
});
106+
107+
it("returns an element when no context", () => {
108+
function Home() {
109+
let outlet = useOutlet();
110+
return <div>{outlet ? "outlet" : "no outlet"}</div>;
111+
}
112+
113+
let renderer: TestRenderer.ReactTestRenderer;
114+
TestRenderer.act(() => {
115+
renderer = TestRenderer.create(
116+
<MemoryRouter initialEntries={["/home"]}>
117+
<Routes>
118+
<Route path="/home" element={<Home />}>
119+
<Route index element={<div>index</div>} />
120+
</Route>
121+
</Routes>
122+
</MemoryRouter>
123+
);
124+
});
125+
126+
expect(renderer.toJSON()).toMatchInlineSnapshot(`
127+
<div>
128+
outlet
129+
</div>
130+
`);
131+
});
132+
133+
it("returns an element when context", () => {
134+
function Home() {
135+
let outlet = useOutlet({ some: "context" });
136+
return <div>{outlet ? "outlet" : "no outlet"}</div>;
137+
}
138+
139+
let renderer: TestRenderer.ReactTestRenderer;
140+
TestRenderer.act(() => {
141+
renderer = TestRenderer.create(
142+
<MemoryRouter initialEntries={["/home"]}>
143+
<Routes>
144+
<Route path="/home" element={<Home />}>
145+
<Route index element={<div>index</div>} />
146+
</Route>
147+
</Routes>
148+
</MemoryRouter>
149+
);
150+
});
151+
152+
expect(renderer.toJSON()).toMatchInlineSnapshot(`
153+
<div>
154+
outlet
155+
</div>
156+
`);
157+
});
58158
});
59159

60-
describe("when there is no context", () => {
160+
describe("OutletContext when there is no context", () => {
61161
it("returns null", () => {
62162
function Users() {
63163
return useOutlet();
@@ -98,7 +198,7 @@ describe("useOutlet", () => {
98198
});
99199
});
100200

101-
describe("when there is context", () => {
201+
describe("OutletContext when there is context", () => {
102202
it("returns the context", () => {
103203
function Users() {
104204
return useOutlet([

packages/react-router/index.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -579,9 +579,12 @@ export function useOutletContext<Context = unknown>(): Context {
579579
*/
580580
export function useOutlet(context?: unknown): React.ReactElement | null {
581581
let outlet = React.useContext(RouteContext).outlet;
582-
return (
583-
<OutletContext.Provider value={context}>{outlet}</OutletContext.Provider>
584-
);
582+
if (outlet) {
583+
return (
584+
<OutletContext.Provider value={context}>{outlet}</OutletContext.Provider>
585+
);
586+
}
587+
return outlet;
585588
}
586589

587590
/**

0 commit comments

Comments
 (0)