forked from remix-run/react-router
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.tsx
More file actions
99 lines (88 loc) · 1.79 KB
/
App.tsx
File metadata and controls
99 lines (88 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import * as React from "react";
import {
Routes,
Route,
Outlet,
Link,
useMatch,
useResolvedPath,
} from "react-router-dom";
import type { LinkProps } from "react-router-dom";
export default function App() {
return (
<div>
<h1>Custom Link Example</h1>
<p>
This example demonstrates how to create a custom{" "}
<code><Link></code> component that knows whether or not it is
"active" using the low-level <code>useResolvedPath()</code> and
<code>useMatch()</code> hooks.
</p>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="*" element={<NoMatch />} />
</Route>
</Routes>
</div>
);
}
function CustomLink({ children, to, ...props }: LinkProps) {
let resolved = useResolvedPath(to);
let match = useMatch({ path: resolved.pathname, end: true });
return (
<div>
<Link
style={{ textDecoration: match ? "underline" : "none" }}
to={to}
{...props}
>
{children}
</Link>
{match && " (active)"}
</div>
);
}
function Layout() {
return (
<div>
<nav>
<ul>
<li>
<CustomLink to="/">Home</CustomLink>
</li>
<li>
<CustomLink to="/about">About</CustomLink>
</li>
</ul>
</nav>
<hr />
<Outlet />
</div>
);
}
function Home() {
return (
<div>
<h1>Home</h1>
</div>
);
}
function About() {
return (
<div>
<h1>About</h1>
</div>
);
}
function NoMatch() {
return (
<div>
<h1>Nothing to see here!</h1>
<p>
<Link to="/">Go to the home page</Link>
</p>
</div>
);
}