15 React Router 설치
16 React Router - Switch & exact
17 NavBar 스타일
import { useState } from 'react';
import axios from 'axios';
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from 'react-router-dom';
function App() {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
const onSubmit = () => {
axios.post('http://localhost:3001/posts', {
title: title,
body: body
})
};
return (
<Router>
<nav class="navbar navbar-dark bg-dark">
<div class="container-fluid">
<Link class="navbar-brand" to="/">
Home
</Link>
<ul class="navbar-nav">
<li class="nav-item">
<Link class="nav-link active" aria-current="page" to="/blogs">
Blogs
</Link>
</li>
</ul>
</div>
</nav>
<Switch>
<Route path="/" exact>Home Page</Route>
<Route path="/blogs">
<div className="container">
<h1>Create a blog post</h1>
<div className="mb-3">
<label className="form-label">Title</label>
<input
className="form-control"
value={title}
onChange={ (e) => {
setTitle(e.target.value);
} }
/>
</div>
<div className="mb-3">
<label class Name="form-label">Body</label>
<textarea
className="form-control"
value={body}
onChange={ (e) => {
setBody(e.target.value);
} }
/>
</div>
<button
className="btn btn-primary"
onClick={onSubmit}
>
Post
</button>
</div>
</Route>
</Switch>
</Router>
);
}
export default App;
18 생성 Form 컴포넌트로 빼내기
컴포넌트로 빼내면 재사용할 수 있어서 좋다.
BlogForm.js
import { useState } from 'react';
import axios from 'axios';
const BlogForm = () => {
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
const onSubmit = () => {
axios.post('http://localhost:3001/posts', {
title: title,
body: body
})
};
return (
<div className="container">
<h1>Create a blog post</h1>
<div className="mb-3">
<label className="form-label">Title</label>
<input
className="form-control"
value={title}
onChange={ (e) => {
setTitle(e.target.value);
} }
/>
</div>
<div className="mb-3">
<label class Name="form-label">Body</label>
<textarea
className="form-control"
value={body}
onChange={ (e) => {
setBody(e.target.value);
} }
/>
</div>
<button
className="btn btn-primary"
onClick={onSubmit}
>
Post
</button>
</div>
);
};
export default BlogForm;
파일을 만든 다음
App.js에서
import BlogForm from './components/BlogForm';
<Route path="/blogs">
<BlogForm />
</Route>
로 사용!
19 NavBar 컴포넌트로 빼내기
NavBar.js
import { Link } from 'react-router-dom';
const NavBar = () => {
return (
<nav className="navbar navbar-dark bg-dark">
<div className="container-fluid">
<Link className="navbar-brand" to="/">
Home
</Link>
<ul className="navbar-nav">
<li className="nav-item">
<Link className="nav-link active" aria-current="page" to="/blogs">
Blogs
</Link>
</li>
</ul>
</div>
</nav>
);
};
export default NavBar;
App.js
import {
BrowserRouter as Router,
Switch,
Route
} from 'react-router-dom';
import BlogForm from './components/BlogForm';
import NavBar from './components/NavBar';
function App() {
return (
<Router>
<NavBar />
<div className="container">
<Switch>
<Route path="/" exact>
Home Page
</Route>
<Route path="/blogs">
<BlogForm />
</Route>
</Switch>
</div>
</Router>
);
}
export default App;
=> 훨씬 간결해짐 !
20 페이지 추가
const HomePage = () => {
return (
<div>Home Page</div>
);
};
export default HomePage;
import BlogForm from '../components/BlogForm';
const CreatePage = () => {
return (
<div>
<BlogForm />
</div>
);
};
export default CreatePage;
const EditPage = () => {
return (
<div>Edit Page</div>
);
};
export default EditPage;
const ListPage = () => {
return (
<div>List Page</div>
);
};
export default ListPage;
App.js
import {
BrowserRouter as Router,
Switch,
Route
} from 'react-router-dom';
import NavBar from './components/NavBar';
import HomePage from './pages/HomePage';
import CreatePage from './pages/CreatePage';
import EditPage from './pages/EditPage';
import ListPage from './pages/ListPage';
function App() {
return (
<Router>
<NavBar />
<div className="container">
<Switch>
<Route path="/" exact>
<HomePage />
</Route>
<Route path="/blogs" exact>
<ListPage />
</Route>
<Route path="/blogs/create" exact>
<CreatePage />
</Route>
<Route path="/blogs/edit" exact>
<EditPage />
</Route>
</Switch>
</div>
</Router>
);
}
export default App;
(Optional) 자바스크립트 map 함수
21 routes 파일 만들기
중복되는 거 없애보자..
function App() {
return (
<Router>
<NavBar />
<div className="container">
<Switch>
{[ // 중괄호 쓰면 변수나 객체 사용 가능
<Route path="/" exact>
<HomePage />
</Route>,
<Route path="/blogs" exact>
<ListPage />
</Route>,
<Route path="/blogs/create" exact>
<CreatePage />
</Route>,
<Route path="/blogs/edit" exact>
<EditPage />
</Route> // 라우트를 하나의 아이템으로 해서 배열에 넣어보자
]}
</Switch>
</div>
</Router>
);
}
import {
BrowserRouter as Router,
Switch,
Route
} from 'react-router-dom';
import NavBar from './components/NavBar';
import HomePage from './pages/HomePage';
import CreatePage from './pages/CreatePage';
import EditPage from './pages/EditPage';
import ListPage from './pages/ListPage';
const routes = [
{
path: '/',
component: HomePage
},
{
path: '/blogs',
component: ListPage
},
{
path: '/blogs/create',
component: CreatePage
},
{
path: '/blogs/edit',
component: EditPage
}
];
function App() {
return (
<Router>
<NavBar />
<div className="container">
<Switch>
{routes.map((route) => {
return <Route exact path={route.path} component={route.component} />
})}
</Switch>
</div>
</Router>
);
}
export default App;
routes.js
import HomePage from './pages/HomePage';
import CreatePage from './pages/CreatePage';
import EditPage from './pages/EditPage';
import ListPage from './pages/ListPage';
const routes = [
{
path: '/',
component: HomePage
},
{
path: '/blogs',
component: ListPage
},
{
path: '/blogs/create',
component: CreatePage
},
{
path: '/blogs/edit',
component: EditPage
}
];
export default routes;
App.js
import {
BrowserRouter as Router,
Switch,
Route
} from 'react-router-dom';
import NavBar from './components/NavBar';
import routes from './routes';
function App() {
return (
<Router>
<NavBar />
<div className="container">
<Switch>
{routes.map((route) => {
return <Route exact path={route.path} component={route.component} />
})}
</Switch>
</div>
</Router>
);
}
export default App;
22 NavLink
NavBar.js
import { Link, NavLink } from 'react-router-dom';
const NavBar = () => {
return (
<nav className="navbar navbar-dark bg-dark">
<div className="container-fluid">
<Link className="navbar-brand" to="/">
Home
</Link>
<ul className="navbar-nav">
<li className="nav-item">
<NavLink
activeClassName="active"
className="nav-link"
aria-current="page"
to="/blogs"
>
Blogs
</NavLink>
</li>
</ul>
</div>
</nav>
);
};
export default NavBar;
(Optional) React Router 작동 원리
'Frontend > 프로젝트로 배우는 React.js' 카테고리의 다른 글
섹션 5. 블로그 디테일 페이지 (1) | 2023.11.29 |
---|---|
Axios Error: Network Error (0) | 2023.11.29 |
섹션 4. 블로그 리스트 (1) | 2023.11.26 |
섹션 2 (1) | 2023.11.03 |
섹션 0, 섹션 1 (0) | 2023.11.02 |