โ๏ธ React ๊ณต์๋ฌธ์์์ ์ค๋ช
ํ๋ useRef
useRef
๋.current
ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์(initialValue)๋ก, ์ด๊ธฐํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํref
๊ฐ์ฒด๋ฅผ ๋ฐํ.- ๋ณธ์ง์ ์ผ๋ก useRef๋ .current ํ๋กํผํฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ ๋ด๊ณ ์๋ โ์์โ๋ก์, ๊ฐ์ฒด์ด๋ค.
useRef()
๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์์ฑ{current: ...}
- useRef๋ ๋งค๋ฒ ๋ ๋๋ง์ ํ ๋ ๋์ผํ
ref
๊ฐ์ฒด๋ฅผ ์ ๊ณต. - useRef๋ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ๋ ์๋ ค์ฃผ์ง ์์ผ๋ฉฐ,
.current
ํ๋กํผํฐ๋ฅผ ๋ณํํ๋ ๊ฒ์ด ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง๋ ์๋๋ค.
โ๏ธ ์ ๋ฆฌํ๋ฉด useRef
๋
ref
๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ด๋hook
์ด๋ฉฐref
๋render
๋ฉ์๋์์ ์์ฑ๋ DOM node๋ React Element์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.ref
๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๊ณ- ์ด๋
ref
๊ฐ์ฒด ์์ ๊ฐ์ React์ ์๋ช ์ฃผ๊ธฐ์์ ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์re-render
์ ์๊ด์์ด ๊ฐ์ด ์ ์ง๋๋ค - ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋
render
๋์ง ์๊ณ ,render
๋๋๋ผ๋ ๊ฐ์ด ์ ์ง๋๋ ํน์ง์ ๊ฐ์ง๋ค
useRef
์ฌ์ฉ ์ฌ๋ก
- ํน์ DOM์ ์ ๊ทผํด์ผ ํ ๋
- ํน์ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
- ์คํฌ๋กค๋ฐ ์์น ๊ฐ์ ธ์ค๊ธฐ ๋๋ ์ค์
- ์ธํ๋ฐ์ค ํฌ์ปค์ค ์ค์ ๋ฑ
- ๋ค์ ๋ ๋๋ง ๋์ด๋ ๋์ผํ ์ฐธ์กฐ๊ฐ์ ์ ์งํ ๋
- ์ผ๋ฐ ๋ณ์๋ ์ฌ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ๊ฐ ์ผ์ด๋๊ณ
- state ๋ํ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฏ๋ก
- setInterval, setTimeout clear ํ ๋ ๋ฑ
:: ์ฝ๋ ์์
- ๋ค์ ๋ ๋๋ง ๋์ด๋ ๋์ผํ ์ฐธ์กฐ๊ฐ์ ์ ์งํ ๋
- state๊ฐ ๋ณํ๋๋ผ๋ render์ ์๊ด์์ด ์ ์ง๋๋ฏ๋ก, state๊ฐ ๋ฐ๋์ด๋
ref
์์ ๊ฐ์0
์ด ์ ์ง
import React, { useEffect, useState, useRef } from 'react';
const Example = () =>{
const [count, setCount] = useState(0);
const countRef = useRef(count);
useEffect(() => {
countRef.current = count;
},[count]) // (1) ์ฒซ ๋ฒ์งธ useEffect
useEffect(() => {
return () => {
console.log("unmount ์ ์ถ๋ ฅ", countRef.current);
};
}, []); // (2) ๋ ๋ฒ์งธ useEffect
return (
<>
<h1>{count}</h1>
<button onClick={()=>setCount(c=>c+1)}>+<button/>
</>
}
!! ์ฐธ๊ณ ์๋ฃ