๐Ÿ”ฎ Airbnb ์ˆ™์†Œ ํŽ˜์ด์ง€ ํด๋ก  ์ฝ”๋”ฉ: React Hook ์‚ฌ์šฉ๊ธฐ

hyeondoongeยท2021๋…„ 3์›” 1์ผ
0
post-thumbnail

๋ฌธ์„œ ์ด๊ฒƒ์ €๊ฒƒ ์ฐธ๊ณ ํ•˜๋‹ค๊ฐ€ ๋™์ ์œผ๋กœ DOM๋…ธ๋“œ์˜ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ React Hook์ด๋ผ๋Š” ํ•ด๋‹ต์„ ์–ป์–ด์„œ Carousel์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด์ „์— ๊ณต์‹ ๋ฌธ์„œ๋Š” ๋ดค์ง€๋งŒ ๋‹น์žฅ์€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์„œ ์ง€๋‚˜์ณค์—ˆ๋Š”๋ฐ ๋‚˜ํ•œํ…Œ ๋ชน์‹œ ํ•„์š”ํ•œ ๊ธฐ์ˆ ์ด์˜€๋‹ค..!

๐Ÿคทโ€โ™€๏ธ React Hook ?


๐Ÿ‘† React Hook๊ณต์‹๋ฌธ์„œ - Hook ๊ฐœ์š” (https://ko.reactjs.org/docs/hooks-overview.html)

์›๋ž˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์ด ์ง€์›๋˜์ง€ ์•Š์•„์„œ ์ •์  ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ถˆ๋ ธ๋‹ค๊ณ  ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•  ๊ฒฝ์šฐ,
ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋กœ์„œ ์žฌ์ž‘์„ฑ์„ ํ•ด์•ผํ–ˆ๋‹ค๊ณ ํ•œ๋‹ค..
ํ•˜์ง€๋งŒ, React ๋ฒ„์ „์ด ๋†’์•„์ง€๋ฉด์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”์—†์ด state๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” React Hook์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋๋‹ค. ๐Ÿ‘๐Ÿ‘๐Ÿ‘

๐Ÿง useState, useRef, useEffect ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์ด ํ•จ์ˆ˜๋“ค์€ ๋ชจ๋‘ 'react' ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋‹ˆ importํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ๊ฐ์˜ ์šฉ๋„๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด์ž.

โœ” useState - ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋กœ
์‚ฌ์šฉ์‹œ state๋ณ€์ˆ˜์™€ ๋ณ€๊ฒฝํ•  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์ธ์ž๋กœ state ์ดˆ๊ธฐ๊ฐ’์„ ์ „๋‹ฌ

์•„๋ž˜์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const [slideNumber, setSlideNumber] = useState(0);

useState๋Š” state ๋ณ€์ˆ˜์™€ state๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โœ” useRef - ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ref ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ์ „ ์ƒ๋ช…์ฃผ๊ธฐ๋™์•ˆ ์œ ์ง€๋จ. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ref๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋จ.
์ธ์ž๋Š” .current ํ”„๋กœํผํ‹ฐ์— ์ „๋‹ฌ๋œ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์‹œ๋Š” Carousel ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์ฝ”๋“œ์ด๋‹ค.


const slideRef = useRef(null);

...
	
useEffect(() => {
  slideRef.current.style.transform = 
    		`translateX(-${currentSlide}00%)`;
  }, [currentSlide]);

slide์˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ref ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DOM๋…ธ๋“œ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

โœ” useEffect - ๋ฆฌ์•กํŠธ์—๊ฒŒ ๋ฆฌ๋ Œ๋”๋งํ›„ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ์ผ์„ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜. state์— ํ•  ์ˆ˜ ์žˆ๊ธฐ์— state์— ๋”ฐ๋ฅธ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ. ์ฐธ๊ณ ๋กœ, ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ ์ด ํ•จ์ˆ˜๋ฅผ effect๋ผ๊ณ  ๋ถ€๋ฆ„.
๋˜ํ•œ optionalํ•˜๊ฒŒ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Š” state์˜ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ effect ์‹คํ–‰์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š”๋ฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ React hook์„ ์‚ฌ์šฉํ•ด ๋น„๋กœ์†Œ ๋™์  ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค ! ๐Ÿ˜™

carousel ์ฝ”๋“œ ์ „์ฒด๋Š” ๐Ÿ‘‰https://github.com/Hyeondoonge/Airbnb-Clone/blob/main/airbnb-app/src/components/Content/Carousel.js

0๊ฐœ์˜ ๋Œ“๊ธ€