UseRef

์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋ฆฌ๋ Œ๋”๋ง ์—†์ด ์ •๋ณด๋ฅผ ๊ธฐ์–ต

  • useRef๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ, useState์™€ ๋‹ฌ๋ฆฌ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ ๋˜์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์šฉ๋ฒ•

const ref = useRef(initialValue)
  • ref.current๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ฝ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ref.current๋Š” ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค.

  • ๋ Œ๋”๋ง์— ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ๋ณด์œ ํ•  ๋•Œ ์ด ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

  • ๋ Œ๋”๋ง ์ค‘์— ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค -> ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘์„ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. -> ๋Œ€์‹  useState๋ฅผ ์‚ฌ์šฉ

Timer ํ•จ์ˆ˜ id ์ €์žฅ

  1. setInterval, setTimeoutํ•จ์ˆ˜๋Š” ํƒ€์ด๋จธ id ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

  2. useRef๋กœ id๊ฐ’์„ ์ €์žฅํ•œ๋‹ค

  3. clearInterval(ref.current),clearTimeout(ref.current)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํƒ€์ด๋จธ๋ฅผ ์ค‘์ง€

const intervalRef = useRef(null);
function handleStart() {
    clearInterval(intervalRef.current);
    intervalRef.current = setInterval(() => {
        setNow(Date.now());
    }, 10);
}

function handleStop() {
    clearInterval(intervalRef.current);
}

DOM ์—˜๋ฆฌ๋จผํŠธ ์ฐธ์กฐ

  1. html ์š”์†Œ์— ref ์†์„ฑ์„ ํ†ตํ•ด ์ฐธ์กฐ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค

  2. Mount๋œ ์ดํ›„์— ref.current๋กœ DOM ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. Unmount๋˜๋ฉด ref.current๋Š” null ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

const headerRef = useRef(null)
return (<header ref={headerRef}></header>)

Ref ์ฝœ๋ฐฑ ํ•จ์ˆ˜

  • ํ•ด๋‹น DOM ๋…ธ๋“œ๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋ฉด(DOM ํŠธ๋ฆฌ์— ์žˆ์„ ๋•Œ) node๋Š” ํ•ด๋‹น DOM ๋…ธ๋“œ ์ฐธ์กฐ ๊ฐ’์„ ๊ฐ€์ง

  • DOM ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด node๋Š” null ๊ฐ’์„ ๊ฐ€์ง

ref ์ฝœ๋ฐฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

  • ref ์ฝœ๋ฐฑ์€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ๋ผ์ธ ํ•จ์ˆ˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

  • ์ฒ˜์Œ์—๋Š” ๋งˆ์šดํŠธ ๋œ ์ดํ›„์— ์‹คํ–‰๋˜๋ฏ€๋กœ DOM ๋…ธ๋“œ๊ฐ€ ์ฐํžˆ๊ณ 

  • ๋‹ค์Œ ๋ฆฌ๋ Œ๋”๋ง ๋ถ€ํ„ฐ๋Š” null์ด ์ฐํžŒ ํ›„์— DOM ๋…ธ๋“œ๊ฐ€ ์ฐํžŒ๋‹ค.

<div ref={(node) => console.log(node)} />
//<div></div>
//null
//<div></div>
//null
//<div></div>
//null
  • ์˜ˆ๋ฅผ ๋“ค์–ด useCallback์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง ์‹œ์—๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด

  • ๋ฆฌ๋ Œ๋”๋ง ์‹œ์—๋„ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

const consoleLog = useCallback((node) => {
	console.log(node);
}, []);
return(<div className="App" ref={consoleLog}>)
//<div></div> ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ์—๋งŒ ์‹คํ–‰๋จ

Map ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ref ๊ด€๋ฆฌ

  • ๋งŽ์€ DOM ๋…ธ๋“œ ์ฐธ์กฐ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด์ด๋‚˜ Map ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ•˜๋‚˜์˜ useRef์— Map ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ํ•ด๋‹น Map ๊ฐ์ฒด ์•ˆ์— id๊ฐ’์„ key๋กœ ref๋ฅผ ๊ฐ๊ฐ ์ €์žฅ

<ul>
    {catList.map(cat => (
        <li
            key={cat.id}
            ref={(node) => {
                const map = getMap();
                if (node) {
                  map.set(cat.id, node);
                } else {
                  map.delete(cat.id);
                }
            }}
        >
        {cat.name}
        </li>
    ))}
</ul>

forwardRef๋กœ ref ๋…ธ์ถœ

์ฐธ์กฐ

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ DOM ๋…ธ๋“œ(ref)๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • forwardRef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ์—์„œ ref์†์„ฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

const SomeComponent = forwardRef(render)
const Input = forwardRef((props, ref) => {
  return <input {...props} ref={ref} />;
});

Ref์™€ State์˜ ์ฐจ์ด์ 

  • ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

  • useRef๋Š” ๋ฆฌ๋ Œ๋”๋ง ์‹œ์—๋„ ์ƒ์กดํ•œ๋‹ค

  • useState๋Š” ๋ฆฌ๋ Œ๋”๋ง ์‹œ์— ๋ถˆ๋ณ€๊ฐ’์ด๊ณ , (๊ฐ™์€ ๊ฐ’์ด ์•„๋‹Œ) ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐ ํ•œ๋‹ค.

useRef(initialValue)useState(initialValue)

๋ฐ˜ํ™˜๊ฐ’

{ current: initialValue }

[value, setValue]

๋ฆฌ๋ Œ๋”๋ง

๋ณ€๊ฒฝํ•  ๋•Œ ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝํ•  ๋•Œ ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ’ ๋ณ€๊ฒฝ

current๊ฐ’์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ -> ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

"๋ถˆ๋ณ€" - ์ƒํƒœ ์„ค์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ • -> ๋ฆฌ๋ Œ๋”๋ง์ด ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€

์ฝ๊ธฐ

๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ current ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค

์–ธ์ œ๋“ ์ง€ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ๋ Œ๋”๋ง์—๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ž์ฒด ์ƒํƒœ ์Šค๋ƒ…์ƒท์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ref์˜ ์ผ๋ฐ˜์  ์‚ฌ์šฉ

  • timer ํ•จ์ˆ˜์˜ id ๊ฐ’ ์ €์žฅ

  • DOM element ์กฐ์ž‘์„ ์œ„ํ•œ ๊ฐ’(์ฐธ์กฐ)์„ ์ €์žฅ

  • JSX ๊ณ„์‚ฐ์— ํ•„์š”์—†๋Š” ๊ฐ’ ์ €์žฅ

Last updated