Post page을 구현하는 과정을 적었다.
page를 구현하기 전 route에 먼저 연결하였다.
// post page
import React from 'react';
import PostViewer from '../../components/organisms/post/PostViewer';
const PostPage = () => {
return <PostViewer />;
};
export default PostPage;
// post viewer component
import React from 'react';
const PostViewer = () => {
return <div>글 보기 페이지 입니다.</div>;
};
export default PostViewer;
npm install react-router@6 react-router-dom@6
const App = () => {
const userId = useAppSelector(state => state.userState.id);
return (
<>
<BrowserRouter>
<ul>
// ...
</ul>
<Routes>
<Route index element={<HomePage />} />
<Route path="@:userId/*" element={<VelogPage />} />
// ...
</Routes>
</BrowserRouter>
</>
);
};
export default App;
import React from 'react';
import { Link, Route, Routes } from 'react-router-dom';
import UserPage from './UserPage';
import ArticlePage from './ArticlePage';
import SeriesPage from './SeriesPage';
import PostPage from '../home/PostPage';
const VelogPage = () => {
// ...
return (
<div>
// ...
<Routes>
<Route path="/" element={<ArticlePage />} />
<Route path=":urlSlug" element={<PostPage />} />
<Route path="series" element={<SeriesPage />} />
<Route path="about" element={<UserPage />} />
</Routes>
</div>
);
};
export default VelogPage;
React Route params 호출
post url 정보를 다시 가져오기 위해서 hook을 사용하여 params를 호출해보았다.
import React from 'react';
import { useParams } from 'react-router-dom';
const PostViewer = () => {
let { userId, urlSlug } = useParams<{userId: string, urlSlug: string}>();
return <div>글 보기 페이지 입니다.</div>;
};
export default PostViewer;
GET API 호출
사용하는 axios로 url get을 해온다.
import axios from 'axios';
import React, { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
import { API_HOST } from '../../../constant';
const PostViewer = () => {
const [postBody, setPostBody] = useState<HTMLHtmlElement>();
let { userId, urlSlug } = useParams<{userId: string, urlSlug: string}>();
useEffect(() => {
axios({ baseURL: API_HOST, url: `/@${userId}/${urlSlug}` })
.then(response => {
console.log(response.data);
setPostBody(response.data);
}).catch(error => {
console.error(error);
});
}, [userId, urlSlug]);
console.log(postBody);
return (
<div>
글 보기 페이지 입니다.
</div>
);
};
export default PostViewer;
404 에러 핸들링을 위해 Not found page를 만들어서 App.tsx route path 마지막 줄에 적용해보았다.
<Route path='*' exact={true} component={NotFoundPage} />
baseUrl/ 뒤에 route path가 없는 url을 쳤을 때 NotFoundPage가 호출되었다.
blog url로 바로 접근했을 대에도 not found page를 적용하고 싶었는데 프로젝트 webpack 설정의 오류인지 baseUrl/page1/page2로 접근이 되지않았다.
index.js를 가져오지 못 해서 다음 시간에 추가로 적용하고 viewer에 post내용까지 보여주는 것을 구현할 것이다.
이번 구현을 하면서 조사한 내용은 react route는 router 종류가 2개이다.
window.history.back()
window.history.forward()
<BrowserRouter basename="/calendar">
<Link to="/today"/> // renders <a href="/calendar/today">
<Link to="/tomorrow"/> // renders <a href="/calendar/tomorrow">
</BrowserRouter>
<HashRouter basename="/calendar"/>
<Link to="/today"/> // renders <a href="#/calendar/today">
https://v5.reactrouter.com/web/api/BrowserRouter
https://developer.mozilla.org/ko/docs/Web/API/History_API