오늘은 react-typescript 에서 react-router-dom, loadable, history 를 이용하여 페이지 이동을 구현해보자.
먼저 필요한 모듈을 설치한다.
npm i -D @types/loadable__component @types/react-router-dom history npm i @loadable/component react-router-dom
페이지 관리를 위하여 historyUtils.ts 파일을 작성한다.
src/utils/historyUtils.ts
import { createBrowserHistory } from 'history' export enum HISTORY_ACTION_TYPE { POP = 'POP', PUSH = 'PUSH', REPLACE = 'REPLACE', } export const browserHistory = createBrowserHistory() export function push(targetUrl: string) { browserHistory.push(targetUrl) } export function redirect(targetUrl: string) { browserHistory.replace(targetUrl) } export function reload() { window.location.reload() } export default browserHistory
실제 이동할 페이지의 url 을 관리하기 위해 CommonDomain.ts 를 작성한다.
export enum ROOT { MAIN = '/main', BOARD = '/board' } export const MAIN_ROUTES = { ROOT: `${ROOT.MAIN}`, } export const BOARD_ROUTES = { ROOT: `${ROOT.BOARD}`, }
react-router-dom 의 Router로 모든 컴포넌트를 감싸준다.
src/index.tsx
import React from 'react' import reactDOM from 'react-dom' import { Router } from 'react-router-dom' import { App } from '@/components/App' import history from '@/utils/historyUtils' window.onload = async () => { try{ render() } catch (e) { console.error(e) } } function render(){ reactDOM.render( <Router history={history}> <App /> </Router> ,document.getElementById('app')) }
먼저 main 페이지로 접근 해서 메인페이지에서 board 페이지로 이동할 수 있도록 구현을 해보자.
src/components/App.tsx
import React from 'react' import { Route, Switch } from 'react-router-dom' import loadable from '@loadable/component' import { ROOT } from '@/domains/CommonDomain' export const App = () => { return ( <Switch> <Route path={ROOT.MAIN} component={loadable(() => import('./main'), )} /> <Route path={ROOT.BOARD} component={loadable(() => import('./board'), )} /> </Switch> ) }
위의 코드에서 Switch 로 변경할 영역을 감싸주고 component 에서는 loadable() 을 사용하여 변경할 컴포넌트를 import 해주었다.
먼저 main 페이지를 처리할 것인데, 위의 코드에선 import('./main') 이라고 적었다.
main 디렉토리를 생성하고 index.tsx 파일을 작성한다.
src/components/main/index.tsx
import React from 'react' import { Route, RouteComponentProps, Switch, withRouter } from 'react-router-dom' import { MAIN_ROUTES } from '@/domains/CommonDomain' import { Main } from './Main' export default withRouter((routerProps: RouteComponentProps) => { return( <Switch location={routerProps.location}> <Route path={MAIN_ROUTES.ROOT} component={Main} /> </Switch> ) })
실제로 내용이 들어갈 Main.tsx 파일을 작성한다.
src/components/main/Main.tsx
import React from 'react' import { push } from '@/utils/historyUtils' import { BOARD_ROUTES } from '@/domains/CommonDomain' export const Main = () => { const boardBtn = 'boardBtn' const onClick = () => { push(BOARD_ROUTES.ROOT) } return ( <> <h2>Main</h2> <div> <label htmlFor={boardBtn}></label> <button id={boardBtn} onClick={onClick}> Board </button> </div> </> ) }
이렇게 하면 Main 페이지까지 구현이 완료 된다.
메인페이지에서 button 을 클릭하여 board 페이지로 이동할 수 있도록 onClick 함수에서 push 함수를 사용했다.
이 함수는 위에서 작성했던 historyUtils 를 모듈화 하여 가져온 것이다. 함수 실행 시 board 페이지로 이동된다.
board 페이지도 똑같이 작성한다.
src/components/board/index.tsx
import React from 'react' import { Route, RouteComponentProps, Switch, withRouter } from 'react-router-dom' import { BOARD_ROUTES } from '@/domains/CommonDomain' import { Board } from './Board' export default withRouter((routerProps: RouteComponentProps) => { return( <Switch location={routerProps.location}> <Route path={BOARD_ROUTES.ROOT} component={Board} /> </Switch> ) })
src/components/board/Board.tsx
import React from 'react' export const Board = () => { return ( <> Board </> ) }
결과는 아래와 같다.

'React' 카테고리의 다른 글
[React] date-fns 를 이용하여 날짜 형식 변경하기 - 떽떽대는 개발공부 (0) | 2021.04.21 |
---|---|
[React] redux 를 이용하여 popup 창 구현하기 - 떽떽대는 개발공부 (0) | 2021.04.15 |
[React] react 에서 다국어 처리 적용하기(4) - 떽떽대는 개발공부 (0) | 2021.03.31 |
[React] html 파일에서 css 파일 연결하기 - 떽떽대는 개발공부 (0) | 2021.03.24 |
[React / typescript] typescript 예제 - 떽떽대는 개발공부 (0) | 2021.03.17 |
댓글