Skip to content

Commit 8853f78

Browse files
committed
Merge branch 'bogdansoare-link-basename' into dev
2 parents 207f428 + 53133fa commit 8853f78

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

packages/react-router-dom/__tests__/link-href-test.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,33 @@ describe("Link href", () => {
119119
expect(anchor.props.href).toEqual("/about");
120120
});
121121
});
122+
123+
describe("basename", () => {
124+
it("is correct", () => {
125+
function Home() {
126+
return (
127+
<div>
128+
<h1>Home</h1>
129+
<Link to="/about">About</Link>
130+
</div>
131+
);
132+
}
133+
134+
let renderer: ReactTestRenderer;
135+
act(() => {
136+
renderer = createTestRenderer(
137+
<Router initialEntries={["/app/home"]}>
138+
<Routes basename="/app">
139+
<Route path="home" element={<Home />} />
140+
</Routes>
141+
</Router>
142+
);
143+
});
144+
145+
let anchor = renderer.root.findByType("a");
146+
147+
expect(anchor).not.toBeNull();
148+
expect(anchor.props.href).toEqual("/app/about");
149+
});
150+
});
122151
});

packages/react-router/index.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,15 @@ const RouteContext = React.createContext<RouteContextObject>({
8686
outlet: null,
8787
params: readOnly<Params>({}),
8888
pathname: "",
89+
basename: "",
8990
route: null
9091
});
9192

9293
interface RouteContextObject {
9394
outlet: React.ReactElement | null;
9495
params: Params;
9596
pathname: string;
97+
basename: string;
9698
route: RouteObject | null;
9799
}
98100

@@ -414,7 +416,7 @@ export function useNavigate(): NavigateFunction {
414416
);
415417

416418
let navigator = React.useContext(NavigatorContext);
417-
let { pathname } = React.useContext(RouteContext);
419+
let { pathname, basename } = React.useContext(RouteContext);
418420

419421
let activeRef = React.useRef(false);
420422
React.useEffect(() => {
@@ -427,7 +429,7 @@ export function useNavigate(): NavigateFunction {
427429
if (typeof to === "number") {
428430
navigator.go(to);
429431
} else {
430-
let path = resolvePath(to, pathname);
432+
let path = resolvePath(to, pathname, basename);
431433
(!!options.replace ? navigator.replace : navigator.push)(
432434
path,
433435
options.state
@@ -441,7 +443,7 @@ export function useNavigate(): NavigateFunction {
441443
);
442444
}
443445
},
444-
[navigator, pathname]
446+
[basename, navigator, pathname]
445447
);
446448

447449
return navigate;
@@ -473,8 +475,11 @@ export function useParams(): Params {
473475
* @see https://reactrouter.com/api/useResolvedPath
474476
*/
475477
export function useResolvedPath(to: To): Path {
476-
let { pathname } = React.useContext(RouteContext);
477-
return React.useMemo(() => resolvePath(to, pathname), [to, pathname]);
478+
let { pathname, basename } = React.useContext(RouteContext);
479+
return React.useMemo(
480+
() => resolvePath(to, pathname, basename),
481+
[to, pathname, basename]
482+
);
478483
}
479484

480485
/**
@@ -561,6 +566,7 @@ function useRoutes_(
561566
outlet,
562567
params: readOnly<Params>({ ...parentParams, ...params }),
563568
pathname: joinPaths([basename, pathname]),
569+
basename,
564570
route
565571
}}
566572
/>
@@ -971,7 +977,7 @@ function safelyDecodeURIComponent(value: string, paramName: string) {
971977
*
972978
* @see https://reactrouter.com/api/resolvePath
973979
*/
974-
export function resolvePath(to: To, fromPathname = "/"): Path {
980+
export function resolvePath(to: To, fromPathname = "/", basename = ""): Path {
975981
let {
976982
pathname: toPathname,
977983
search = "",
@@ -981,7 +987,11 @@ export function resolvePath(to: To, fromPathname = "/"): Path {
981987
let pathname = toPathname
982988
? resolvePathname(
983989
toPathname,
984-
toPathname.startsWith("/") ? "/" : fromPathname
990+
toPathname.startsWith("/")
991+
? basename
992+
? normalizeSlashes(`/${basename}`)
993+
: "/"
994+
: fromPathname
985995
)
986996
: fromPathname;
987997

0 commit comments

Comments
 (0)