Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit bfe04b2

Browse files
committed
add intro
1 parent 13e1c43 commit bfe04b2

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed

‎src/App.jsx

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import * as React from 'react';
2+
import {
3+
Routes,
4+
Route,
5+
Outlet,
6+
Link,
7+
NavLink,
8+
useParams,
9+
useNavigate,
10+
useSearchParams,
11+
} from 'react-router-dom';
12+
13+
const App = () => {
14+
const navigate = useNavigate();
15+
16+
const [users, setUsers] = React.useState([
17+
{ id: '1', fullName: 'Robin Wieruch' },
18+
{ id: '2', fullName: 'Sarah Finnley' },
19+
]);
20+
21+
const handleRemoveUser = (userId) => {
22+
setUsers((state) => state.filter((user) => user.id !== userId));
23+
24+
navigate('/users');
25+
};
26+
27+
return (
28+
<Routes>
29+
<Route element={<Layout />}>
30+
<Route index element={<Home />} />
31+
<Route path="home" element={<Home />} />
32+
<Route path="users" element={<Users users={users} />}>
33+
<Route
34+
path=":userId"
35+
element={<User onRemoveUser={handleRemoveUser} />}
36+
/>
37+
</Route>
38+
<Route path="*" element={<NoMatch />} />
39+
</Route>
40+
</Routes>
41+
);
42+
};
43+
44+
const Layout = () => {
45+
const style = ({ isActive }) => ({
46+
fontWeight: isActive ? 'bold' : 'normal',
47+
});
48+
49+
return (
50+
<>
51+
<h1>React Router</h1>
52+
53+
<nav
54+
style={{
55+
borderBottom: 'solid 1px',
56+
paddingBottom: '1rem',
57+
}}
58+
>
59+
<NavLink to="/home" style={style}>
60+
Home
61+
</NavLink>
62+
<NavLink to="/users" style={style}>
63+
Users
64+
</NavLink>
65+
</nav>
66+
67+
<main style={{ padding: '1rem 0' }}>
68+
<Outlet />
69+
</main>
70+
</>
71+
);
72+
};
73+
74+
const Home = () => {
75+
return (
76+
<>
77+
<h2>Home</h2>
78+
</>
79+
);
80+
};
81+
82+
const Users = ({ users }) => {
83+
const [searchParams, setSearchParams] = useSearchParams();
84+
85+
const searchTerm = searchParams.get('name') || '';
86+
87+
const handleSearch = (event) => {
88+
const name = event.target.value;
89+
90+
if (name) {
91+
setSearchParams({ name: event.target.value });
92+
} else {
93+
setSearchParams({});
94+
}
95+
};
96+
97+
return (
98+
<>
99+
<h2>Users</h2>
100+
101+
<input type="text" value={searchTerm} onChange={handleSearch} />
102+
103+
<ul>
104+
{users
105+
.filter((user) =>
106+
user.fullName
107+
.toLowerCase()
108+
.includes(searchTerm.toLocaleLowerCase())
109+
)
110+
.map((user) => (
111+
<li key={user.id}>
112+
<Link to={user.id}>{user.fullName}</Link>
113+
</li>
114+
))}
115+
</ul>
116+
117+
<Outlet />
118+
</>
119+
);
120+
};
121+
122+
const User = ({ onRemoveUser }) => {
123+
const { userId } = useParams();
124+
125+
return (
126+
<>
127+
<h2>User: {userId}</h2>
128+
129+
<button type="button" onClick={() => onRemoveUser(userId)}>
130+
Remove
131+
</button>
132+
133+
<Link to="/users">Back to Users</Link>
134+
</>
135+
);
136+
};
137+
138+
const NoMatch = () => {
139+
return <p>There's nothing here: 404!</p>;
140+
};
141+
142+
export default App;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /