250x250
๋ฐ˜์‘ํ˜•
Notice
Recent Posts
Recent Comments
Link
ยซ   2024/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

BEAT A SHOTGUN

[REACT] react-router ๋ฅผ ์ด์šฉํ•  ๋•Œ component ๋กœ props data๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

PROJECT

[REACT] react-router ๋ฅผ ์ด์šฉํ•  ๋•Œ component ๋กœ props data๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ๋ฒ•

thovy 2022. 9. 13. 23:34
728x90
๋ฐ˜์‘ํ˜•
SMALL

๐Ÿ˜ก ์ƒํ™ฉ

App.js ์— react-router-dom ์„ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™์‹œํ‚ค๊ณ  ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ post(๊ฒŒ์‹œ๊ธ€) ์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋˜๊ณ , postDetail ์—๋Š” ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€๋งŒ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค.

App.js

๊ทธ๋ž˜์„œ App.js ์—์„œ route ํ•˜๋ฉด์„œ

// App.js
<Route path='/post/:id' element={<PostDetail />}  />

์ด๋ ‡๊ฒŒ ํ•ด์„œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€๋กœ ์ด๋™ํ•˜๋„๋ก ํ–ˆ๋‹ค.

Posts.jsx

posts ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋‚˜ํƒ€๋‚œ ๊ฒŒ์‹œ๊ธ€์„ ํด๋ฆญํ–ˆ์„ ๋•Œ props ๋กœ postId ๋ฅผ ๋ฐ›๋„๋กํ–ˆ๋‹ค.

// Posts.jsx
function handlePostDetail(props){
  navigate(`/post/${props}`)
}

PostDetail.jsx

๊ทธ๋Ÿฐ๋ฐ postDetail ์—์„œ๋Š” props๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๋Š” ๋งค์šฐ๋งค์šฐ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์ด ์ƒ๊น€.
ํด๋ฆญ๋œ ๊ฒŒ์‹œ๊ธ€์ธ postDetail ํŽ˜์ด์ง€๊ฐ€ rendering ๋˜๋ฉด์„œ useEffect ๊ฐ€ axios.get()์„ ์‚ฌ์šฉํ•ด ๊ฒŒ์‹œ๊ธ€์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ฃผ์†Œ์— ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ id๊ฐ€ ์ž…๋ ฅ๋˜์–ด์•ผํ•˜๋Š”๋ฐ... ๊ทธ๋ž˜์•ผ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ...

Link ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์•ˆ ๋˜๊ณ , ๋ญ ์–ด๋–ป๊ฒŒ component ์— state ๋ฅผ ์คฌ๋Š”์ง€ ๋‹ค๋“ค ์ž˜๋˜๋Š”๋ฐ ๋‚˜๋งŒ ์•ˆ๋จ.

๐Ÿ˜„ ํ•ด๊ฒฐโœ…

useLocation ์„ ์‚ฌ์šฉํ•œ๋‹ค.

App.js ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ 

Posts.jsx

์˜ navigate ์— state ๋ฅผ ์ด์šฉํ•ด data ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

// Posts.jsx
function handlePostDetail(props){
  navigate(`/post/${props}`, {
      state:{
          postId:props
      }
  })
}

PostDetail.jsx

๊ทธ๋ฆฌ๊ณ  postDetail ์—์„œ๋Š” useLocation ์„ ํ™œ์šฉํ•ด navigate ๊ฐ€ ๋ณด๋‚ธ state ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

// PostDetail.jsx
const postProps = useLocation()

...

useEffect(()=>{
  axios.get(`/post/${postsProps.state.postId}`)
  .then

  ...

๋”ฐ๋ž€~!

์‰ฝ์ฃ ?

๋ฒˆ์™ธ

์ด๋ ‡๊ฒŒ ๋˜๋ฉด useLocation ์„ ์ด์šฉํ•ด ๊ฐ€์ ธ์˜จ data๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋„ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค.
ํ•ด๋‹น ๋Œ“๊ธ€์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ, PostDetail ์—์„œ๋Š” Reply component๋ฅผ ๊ฐ€์ ธ์˜ฌ ํ…๋ฐ,

// PostDetail.jsx
...

  <Reply postId={postProps.state.postId}/>

...

๊ทธ ๋•Œ Reply component ์— ์ €๋Ÿฐ์‹์œผ๋กœ props ๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด reply ๋Š” props ํ˜•ํƒœ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๋’ค๋Š” ์•„์ฃผ ์‰ฝ๋‹ค.

๋

๋‚˜๋Š” useLocation ์„ ๋ชฐ๋ผ์„œ 3์‹œ๊ฐ„์„ ํ˜ผ์ž...

ํ•ญ์ƒ ๋Œ•์ฒญํ•ด์ง€์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž! ๐Ÿ™‹โ€โ™‚๏ธ

728x90
๋ฐ˜์‘ํ˜•
LIST
Comments