React.useRef()

dev.horang๐Ÿฏยท2024๋…„ 6์›” 18์ผ
1
post-thumbnail

๐Ÿ’ก useRef๋Š” ๋ Œ๋”๋ง์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” React Hook์ž…๋‹ˆ๋‹ค.(๊ณต์‹๋ฌธ์„œ)

๋ฌด์ง€์„ฑ ์‚ฌ์šฉํ•˜๋˜ Hook์„ ํŒŒ์•…ํ•ด๋ณด์ž;ใ……;

useRef ์‚ฌ์šฉ

๐Ÿ“๊ฐ’ ์ฐธ์กฐ

useRef๋Š” ์ฒ˜์Œ์— ์ค€ ์ดˆ๊ธฐ๊ฐ’์„ current ํ”„๋กœํผํ‹ฐ๋กœ ref๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•œ๋งˆ๋””๋กœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฝ์„์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ๋งŒ ๋งํ•˜๋ฉด useState์™€ ์ฐจ์ด๊ฐ€ ์—†๊ฒŒ ๋Š๊ปด์ง€๊ฒ ์ง€๋งŒ state ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋žœ๋”๋ง์„ ์ด‰๋ฐœํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅ์‹œ์ผœ์ค€๋‹ค. ํ•˜์ง€๋งŒ useRef์˜ ref ๊ฐ’์€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋ฆฌ๋žœ๋”๋ง์„ ์ด‰๋ฐœ์‹œํ‚ค์ง€ ์•Š์•„ ๋ฆฌ๋žœ๋”๋กœ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ์ ˆํ•˜๋‹ค.

๐Ÿ“DOM ์กฐ์ž‘

useRef๋Š” DOM์˜ ๋…ธ๋“œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

<input ref={inputRef}/>

์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด input์˜ node๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋…ธ๋“œ ๊ด€๋ฆฌ๋Š” ์˜ˆ์‹œ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด input์˜ ์†์„ฑ (focus, value...) ๋“ฑ์„ ๊ด€๋ฆฌ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.

import { forwardRef, useRef } from 'react';

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

export default function Form() {
  const inputRef = useRef(null);

  function handleClick() {
    inputRef.current.focus();
  }

  return (
    <>
      <MyInput ref={inputRef} />
      <button onClick={handleClick}>
        Focus the input
      </button>
    </>
  );
}

์ง์ ‘ useRef() ๋งŒ๋“ค์–ด ๋ณด๊ธฐ

useRef์˜ ์—ญํ• ์„ ์•Œ์•˜์œผ๋‹ˆ useRef์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด๋ณด์ž!

๊ทธ๋Ÿผ ์Œ ์ผ๋‹จ ๋‚ด๊ฐ€ ๋งŒ๋“ค useMyRef๋Š” ํ•ด์•ผํ•  ์—ญํ• ์ด
1. ๊ฐ’์„ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•จ
2. ๊ฐ’์ด ๋ณ€ํ•ด๋„ ๋ฆฌ๋žœ๋”๋ง์ด ๋˜๋ฉด ์•ˆ๋จ
3. dom์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•จ
4. ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ฐ’ ๋ณ€๊ฒฝ์€ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•จ

import { useState } from 'react';

export function useMyRef<T>(initValue: T | null) {
  // ref๋ฅผ ์ €์žฅํ•  state๋ฅผ ์ƒ์„ฑ. { current: initValue}๊ฐ์ฒด๋ฅผ ํ†ตํ•ด current๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋ฆฌ๋žœ๋”๋ง ๋˜์ง€ ์•Š๊ฒŒ ํ•จ
  const [ref, setRef] = useState<{ current: T | null }>(() => ({ current: initValue }));

  // setRef๋ฅผ ํ†ตํ•ด ref์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ.
  const setRefValue = (value: T | null) => {
    setRef({ current: value });
  };

  return [ref, setRefValue];
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์œ„์—์„œ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ์—ญํ• ์ค‘ ๊ฐ’์˜ ํ• ๋‹น์€ useState๋ฅผ ํ†ตํ•ด์„œ ์ฒ˜์Œ initialValue๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  state๊ฐ’์„ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜์—ฌ current์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ๋ฆฌ๋žœ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ useRef ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ dom์ œ์–ด ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ถ”๊ฐ€๋กœ setRef๋ฅผ ํ†ตํ•ด ref๊ฐ’์˜ ๋ณ€๊ฒฝ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ๋‘์—ˆ๋‹ค.

profile
์ข‹์•„ํ•˜๋Š”๊ฑธ ๋ฐฐ์šฐ๋Š”๊ฑด ์‹ ๋‚˜๐ŸŽต

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