๋ฌธ์ ์ด๊ฒ์ ๊ฒ ์ฐธ๊ณ ํ๋ค๊ฐ ๋์ ์ผ๋ก DOM๋ ธ๋์ ์คํ์ผ์ ๋ณ๊ฒฝ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก React Hook์ด๋ผ๋ ํด๋ต์ ์ป์ด์ Carousel์ ๊ตฌํํ ์ ์์๋ค.
์ด์ ์ ๊ณต์ ๋ฌธ์๋ ๋ดค์ง๋ง ๋น์ฅ์ ํ์ํ์ง ์์์ ์ง๋์ณค์๋๋ฐ ๋ํํ ๋ชน์ ํ์ํ ๊ธฐ์ ์ด์๋ค..!
๐ React Hook๊ณต์๋ฌธ์ - Hook ๊ฐ์ (https://ko.reactjs.org/docs/hooks-overview.html)
์๋ ํจ์ํ ์ปดํฌ๋ํธ๋ ์ํ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ด ์ง์๋์ง ์์์ ์ ์ ์ปดํฌ๋ํธ๋ผ๊ณ ๋ถ๋ ธ๋ค๊ณ ํ๋ค.
๊ทธ๋์ ํจ์ํ ์ปดํฌ๋ํธ๋ก ์์ฑํ๋ค๊ฐ ์ํ๋ฅผ ์ฌ์ฉํด์ผํ ๊ฒฝ์ฐ,
ํด๋์ค ์ปดํฌ๋ํธ๋ก์ ์ฌ์์ฑ์ ํด์ผํ๋ค๊ณ ํ๋ค..
ํ์ง๋ง, React ๋ฒ์ ์ด ๋์์ง๋ฉด์ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ํ์์์ด state๋ฅผ ์ง์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ React Hook์ด ๋ฑ์ฅํ๊ฒ ๋๋ค. ๐๐๐
์ด ํจ์๋ค์ ๋ชจ๋ '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