๐Ÿ“บ Front End/- React, Next.js

[React Router & styled-components] ์‹ค์ „์—์„œ withRouter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ(1) :: Router ๊ตฌ์„ฑํ•˜๊ธฐ

Wonit 2020. 10. 7. 02:01

ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ๋Š” ์ด 3๋ถ€์ž‘์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์‹ค์ „์—์„œ withRouter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ(1) :: Router ๊ตฌ์„ฑํ•˜๊ธฐ
  2. ์‹ค์ „์—์„œ withRouter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ(2) :: styled-components๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ๋ง ์ ์šฉํ•˜๊ธฐ
  3. ์‹ค์ „์—์„œ withRouter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ(3) :: withRouter ์‚ฌ์šฉํ•˜๊ธฐ

ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ์—๋Š” react์˜ styled-components์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

 

์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” withRouter์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋Š” ๊ณผ์ •์ด๋ฏ€๋กœ styled-components์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์€ ๊ทธ๋ƒฅ css ์ ์šฉ์„ js ์•ˆ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ตฌ๋‚˜~ ์ •๋„๋งŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

 

ํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์ธ ์ถ”์ฒœ์œผ๋กœ styled-components์— ๋Œ€ํ•ด์„œ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์€ ์ •๋ง ๋ฉ‹์ง€๊ณ  ์ฟจํ•œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ธ”๋กœ๊ทธ์˜
styled-components ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋ฐ Styled-Components์˜ ์ฒ ํ•™์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋ด๋ณด๋Š” ๊ฒƒ์„ ๋งค์šฐ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š”

์ด๋Ÿฐ ์›น ์‚ฌ์ดํŠธ์˜ ์ƒ๋‹จ header๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๊ณ , ํด๋ฆญํ•˜๋Š” ์œ„์น˜๋งˆ๋‹ค border-bottom์˜ ์ƒ‰์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋‹ค.


withRouter

withRouter๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ router์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

๋งŒ์•ฝ withRouter๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด this.context.router๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์‰ฝ์ง€ ์•Š๊ณ  ์˜คํžˆ๋ ค ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์ฃฝ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ withRouter์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

withRouter๋Š” Route๊ฐ€ ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ์—์„œ location, match, history ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

withRouter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€๋งŒ ํฌ๊ฒŒ

  • ๋ณดํ†ต ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ–ˆ์„๋•Œ ํŠน์ • ๊ฒฝ๋กœ๋กœ ๊ฐ€๊ณ  ์‹คํŒจํ•˜๋ฉด ๊ฐ€๋งŒํžˆ ์žˆ๊ณ ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ˜น์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ• ๋–„ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

ํ•œ ๋ฒˆ ์‹ค์Šต์„ ํ†ตํ•ด withRouter๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

์ฝ”๋”ฉํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ์•ž์„œ ๋ณธ ๋””์ž์ธ๋ฒ ์ด์Šค์˜ ํŽ˜์ด์ง€๋ฅผ ํด๋ก ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ js ํŒŒ์ผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ„์„ํ•ด๋ณด์ž.

์œ„์—์„œ Introduce.js๊ฐ€ ์žˆ๋Š”๋ฐ ์ข€ ๋” ์‰ฝ๊ณ  ์ง๊ด€์ ์ธ ๋‹จ์–ด๋ฅผ ์œ„ํ•ด About.js๋กœ ๋ณ€๊ฒฝํ•˜๊ฒ ๋‹ค.

๊ธฐ๋ณธ์ ์ธ Routing ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•ด๋ณด์ž.

 

๊ตฌ์„ฑํ•˜๊ธฐ ์ „์— react-router-dom์„ ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

 

์ž˜ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (3)react-router-dom ์œผ๋กœ ๋ผ์šฐํŒ… ํ•˜๊ธฐ์— ๋“ค์–ด๊ฐ€์„œ ์ค€๋น„๋ฅผ ๋งˆ์น˜๊ณ  ์˜ค์ž.

 

๊ทธ๋ฆฌ๊ณ  import์™€ ๊ฐ™์€ ์ค‘๋ณต๋˜๋Š” ๊ณผ์ •์€ ๋ชจ๋‘ ์ƒ๋žตํ–ˆ๋‹ค.

import React from 'react';
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";

์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

// Header.js
export const Header = () => {
  return (
    <header>
      <Link to="/">DESIGN BASE</Link>
      <Link to="/about">์†Œ๊ฐœ</Link>
      <Link to="/course-design">๋””์ž์ธ ๊ฐ•์ขŒ</Link>
      <Link to="/course-coding">์›น์ฝ”๋”ฉ ๊ฐ•์ขŒ</Link>
      <Link to="/bookmark">๋ถ๋งˆํฌ</Link>
      <Link to="/meetup">๋ฐ‹์—…</Link>
      <Link to="/contact">๋ฌธ์˜ํ•˜๊ธฐ</Link>
    </header>
  );
}

// Routes.js
export const Routes = () => {
  return (
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route path="/course-design" component={CourseDesign} />
      <Route path="/course-coding" component={CourseCoding} />
      <Route path="/bookmark" component={Bookmark} />
      <Route path="/meetup" component={MeetUp} />
      <Route path="/contact" component={Contact} />
    </Switch>
  );
}

// About.js
export default About => "์†Œ๊ฐœ";

// Bookmark.js
export default Bookmark => "๋ถ๋งˆํฌ";

// Contact.js
export default Contact => "๋ฌธ์˜ํ•˜๊ธฐ";

// CourseCoding.js
export default CourseCoding => "์›น ์ฝ”๋”ฉ ์ž…๋ฌธ";

// CourseDesign.js
export default CourseDesign => "๋””์ž์ธ ๊ฐ•์ขŒ";

// Home.js
export default Home => "๊ฐœ์ธ์ ์œผ๋กœ ๋„ˆ๋ฌด ๋ฉ‹์ง€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” DesignBase์˜ Main ํŽ˜์ด์ง€";

// MeetUp.js
export default MeetUp => "๋ฐ‹์—…"

// App.js
export const App = () => {
  return (
    <>
      <Router> // BrowserRouter
        <Header /> 
        <Routes />
      </Router>
    </>
  );
}

export default App;

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜จ๋‹ค.

์ด์ œ ์ค€๋น„๊ฐ€ ๋‹ค ๋๋‚ฌ์œผ๋‹ˆ ์Šคํƒ€์ผ๋ง์„ ์กฐ๊ธˆ ์ ์šฉํ•ด๋ณด๋„๋ก ํ•˜์ž.