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
148 lines (129 loc) · 3.22 KB
/
App.tsx
File metadata and controls
148 lines (129 loc) · 3.22 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import * as React from "react";
import type { RouteObject } from "react-router-dom";
import { Outlet, Link, useRoutes, useParams } from "react-router-dom";
export default function App() {
let routes: RouteObject[] = [
{
path: "/",
element: <Layout />,
children: [
{ index: true, element: <Home /> },
{
path: "/courses",
element: <Courses />,
children: [
{ index: true, element: <CoursesIndex /> },
{ path: "/courses/:id", element: <Course /> },
],
},
{ path: "*", element: <NoMatch /> },
],
},
];
// The useRoutes() hook allows you to define your routes as JavaScript objects
// instead of <Routes> and <Route> elements. This is really just a style
// preference for those who prefer to not use JSX for their routes config.
let element = useRoutes(routes);
return (
<div>
<h1>Route Objects Example</h1>
<p>
This example demonstrates how to use React Router's "route object" API
instead of the JSX API to configure your routes. Both APIs are
first-class. In fact, React Router actually uses the object-based API
internally by creating route objects from your{" "}
<code><Route></code>
elements.
</p>
<p>
React Router exposes a <code>useRoutes()</code> hook that allows you to
hook into the same matching algorithm that <code><Routes></code>{" "}
uses internally to decide which <code><Route></code> to render.
When you use this hook, you get back an element that will render your
entire route hierarchy.
</p>
{element}
</div>
);
}
function Layout() {
return (
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/courses">Courses</Link>
</li>
<li>
<Link to="/nothing-here">Nothing Here</Link>
</li>
</ul>
</nav>
<hr />
<Outlet />
</div>
);
}
function Home() {
return (
<div>
<h2>Home</h2>
</div>
);
}
function Courses() {
return (
<div>
<h2>Courses</h2>
<Outlet />
</div>
);
}
function CoursesIndex() {
return (
<div>
<p>Please choose a course:</p>
<nav>
<ul>
<li>
<Link to="react-fundamentals">React Fundamentals</Link>
</li>
<li>
<Link to="advanced-react">Advanced React</Link>
</li>
<li>
<Link to="react-router">React Router</Link>
</li>
</ul>
</nav>
</div>
);
}
function Course() {
let { id } = useParams<"id">();
return (
<div>
<h2>
Welcome to the {id!.split("-").map(capitalizeString).join(" ")} course!
</h2>
<p>This is a great course. You're gonna love it!</p>
<Link to="/courses">See all courses</Link>
</div>
);
}
function capitalizeString(s: string): string {
return s.charAt(0).toUpperCase() + s.slice(1);
}
function NoMatch() {
return (
<div>
<h2>It looks like you're lost...</h2>
<p>
<Link to="/">Go to the home page</Link>
</p>
</div>
);
}