Skip to content

Commit 291bfd0

Browse files
authored
Support sensitive matchPath option in NavLink (remix-run#7251)
* Support `sensitive` matchPath option in NavLink * Add NavLink sensitive prop tests
1 parent 402ecab commit 291bfd0

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

packages/react-router-dom/modules/NavLink.js

+3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const NavLink = forwardRef(
3232
exact,
3333
isActive: isActiveProp,
3434
location: locationProp,
35+
sensitive,
3536
strict,
3637
style: styleProp,
3738
to,
@@ -59,6 +60,7 @@ const NavLink = forwardRef(
5960
? matchPath(currentLocation.pathname, {
6061
path: escapedPath,
6162
exact,
63+
sensitive,
6264
strict
6365
})
6466
: null;
@@ -114,6 +116,7 @@ if (__DEV__) {
114116
exact: PropTypes.bool,
115117
isActive: PropTypes.func,
116118
location: PropTypes.object,
119+
sensitive: PropTypes.bool,
117120
strict: PropTypes.bool,
118121
style: PropTypes.object
119122
};

packages/react-router-dom/modules/__tests__/NavLink-test.js

+62
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,68 @@ describe("A <NavLink>", () => {
490490
});
491491
});
492492

493+
describe("with `sensitive=true`", () => {
494+
it("applies default activeClassName for sensitive matches", () => {
495+
renderStrict(
496+
<MemoryRouter initialEntries={["/pizza"]}>
497+
<NavLink sensitive to="/pizza">
498+
Pizza!
499+
</NavLink>
500+
</MemoryRouter>,
501+
node
502+
);
503+
504+
const a = node.querySelector("a");
505+
506+
expect(a.className).toContain("active");
507+
});
508+
509+
it("does not apply default activeClassName for non-sensitive matches", () => {
510+
renderStrict(
511+
<MemoryRouter initialEntries={["/PIZZA"]}>
512+
<NavLink sensitive to="/pizza">
513+
Pizza!
514+
</NavLink>
515+
</MemoryRouter>,
516+
node
517+
);
518+
519+
const a = node.querySelector("a");
520+
521+
expect(a.className).not.toContain("active");
522+
});
523+
524+
it("applies custom activeClassName for sensitive matches", () => {
525+
renderStrict(
526+
<MemoryRouter initialEntries={["/pizza"]}>
527+
<NavLink sensitive to="/pizza" activeClassName="selected">
528+
Pizza!
529+
</NavLink>
530+
</MemoryRouter>,
531+
node
532+
);
533+
534+
const a = node.querySelector("a");
535+
536+
expect(a.className).toContain("selected");
537+
});
538+
539+
it("does not apply custom activeClassName for non-sensitive matches", () => {
540+
renderStrict(
541+
<MemoryRouter initialEntries={["/pizza"]}>
542+
<NavLink sensitive to="/PIZZA" activeClassName="selected">
543+
Pizza!
544+
</NavLink>
545+
</MemoryRouter>,
546+
node
547+
);
548+
549+
const a = node.querySelector("a");
550+
551+
expect(a.className).not.toContain("selected");
552+
});
553+
});
554+
493555
describe("the `location` prop", () => {
494556
it("overrides the current location", () => {
495557
renderStrict(

0 commit comments

Comments
 (0)