๐Ÿ‘ฉ‍๐Ÿ’ป/React

[React.js๋กœ ๋งŒ๋“œ๋Š” Tech Blog] #2 react router ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ

ํ•œ๋‚˜ 2021. 2. 13. 15:48

2021/02/09 - [๐Ÿ‘ฉ‍๐Ÿ’ป/React.js] - [React.js๋กœ ๋งŒ๋“œ๋Š” Tech Blog] #1 Figma ํ”„๋กœํ† ํƒ€์ดํ•‘/๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…/Grommet UI Library/useState/Responsive Header ๋งŒ๋“ค๊ธฐ

 

[React.js๋กœ ๋งŒ๋“œ๋Š” Tech Blog] #1 Figma ํ”„๋กœํ† ํƒ€์ดํ•‘/๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…/Grommet UI Library/useState/Responsive Header

ํ…Œํฌ ๋ธ”๋กœ๊ทธ ๊ธฐํš ๊ธฐ์กด์— GIthub Pages๋กœ ๋ฐฐํฌํ•œ github.io ๋ธ”๋กœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธด ํ–ˆ์ง€๋งŒ, ๊ธ‰ํ•  ๋•Œ ํ…œํ”Œ๋ฆฟ ๊ฐ€์ง€๊ณ  ์™€์„œ ๊ณ ์ณ ์“ด ๊ฒŒ ๋‹ค๋ผ ๋ ˆ์ด์•„์›ƒ์— ์ œ์•ฝ์ด ์ปค ์•„์˜ˆ ์ƒˆ๋กœ ์ œ์ž‘ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ œ์ž‘ํ•˜๋ฉฐ ์—ฌ

uiyoji-journal.tistory.com


๋žœ๋”ฉ ํŽ˜์ด์ง€

๋žœ๋”ฉ ํŽ˜์ด์ง€๋กœ๋งŒ ๊พธ๋ช„๋‹ค๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜์€ ๋” ์† ๋ณด์ง€ ์•Š์•„๋„ ๋˜์—ˆ์ง€๋งŒ Blog ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Router์— ๋”ฐ๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์œ„ํ•ด react router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

yarn add react-router-dom

 

yarn์„ ์ด์šฉํ•ด Web ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ react-router-dom์„ ์„ค์น˜ํ•ด์ค€๋‹ค. react-router-dom์€ ๋™์  ๋ผ์šฐํŒ…์„ ์œ„ํ•ด <Link>, <Route> ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์€ ํ•ญ์ƒ <Router> ์ปดํฌ๋„ŒํŠธ๋กœ ์‹ธ์—ฌ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” BrowserRouter๋ฅผ Router ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, index.js์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

 

 

 

์ด์ œ <App> ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์—์„œ๋Š” <Link>, <Route> ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Link, useLocation

Headr์—์„œ ํ˜„์žฌ ๋ผ์šฐํ„ฐ ์ฃผ์†Œ๊ฐ€ '/'์— ์œ„์น˜ํ•  ๊ฒฝ์šฐ ๋ณด์—ฌ์ง€๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งํฌ ์•„์ดํ…œ๋“ค๊ณผ '/blog'์— ์œ„์น˜ํ•  ๊ฒฝ์šฐ ๋ณด์—ฌ์ง€๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งํฌ ์•„์ดํ…œ๋“ค์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ๊พธ๋ช„๋‹ค.

 

 

 

 

useLocation์„ import ํ•ด์ค€ ๋’ค, useLocation().pathname์„ ํ•ด์ฃผ๋ฉด ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ € URL์˜ pathname์„ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค. window.location.pathname์„ ์จ๋ดค๋‹ค๊ฐ€, react-dom-router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋“ฏํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ผ๋‹ค.

 

<Link> ์ปดํฌ๋„ŒํŠธ๋Š” to prop์„ ๋ฐ›์•„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ URL ์ฃผ์†Œ๋ฅผ to prop์— ์ ์€ pathname์„ ๋ถ™์—ฌ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

ํ˜„์žฌ ์ฃผ์†Œ๊ฐ€ http://localhost:3000/blog ์— ์œ„์น˜ํ•  ๊ฒฝ์šฐ
ํ˜„์žฌ ์ฃผ์†Œ๊ฐ€ http://localhost:3000/ ์— ์œ„์น˜ํ•  ๊ฒฝ์šฐ

๊ทธ๋Ÿฌ๋ฉด ๋ผ์šฐํ„ฐ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋ Œ๋”๋ง๋  ๋ถ€๋ถ„๋„ ๋‹ฌ๋ผ์ ธ์•ผ ํ•œ๋‹ค. ๋‚˜๋Š” App Bar์™€ Footer ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•˜๋Š” ๋ฐ”๋”” ์ปดํฌ๋„ŒํŠธ๋Š” ๊ณตํ†ต์œผ๋กœ ์“ฐ๊ณ  ์‹ถ์–ด์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์คฌ๋‹ค.

 

 

 

exact={true} prop์„ ์ด์šฉํ•  ๋•Œ๋Š” path='/'๋กœ ์„ค์ •๋˜์—ˆ์„ ๋•Œ '/blog' ๊ฐ™์ด '/'๋ฅผ ํฌํ•จํ•œ path๋Š” ๋ฌด์‹œํ•˜๊ณ , '/'๊ฐ€ pathname์ผ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

component={} ํ˜•ํƒœ๋กœ prop์„ ์“ธ ๋•Œ๊ฐ€ ์žˆ๊ณ , component์— ๊ทธ ์™ธ prop์„ ์ „๋‹ฌํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์œผ๋ฉด component = {() => {}} ํ˜•ํƒœ๋กœ ์จ์ฃผ๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  ์ค‘์ฒฉ์œผ๋กœ Routing๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.