Front-End/React

React] Hook : useRef

์™•๊ฐ€๐Ÿ‘ 2023. 6. 20. 11:29
728x90
๋ฐ˜์‘ํ˜•

useRef

useRef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ DOM์— ์ ‘๊ทผํ•˜์—ฌ ํƒœ๊ทธ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const ref = useRef(์ดˆ๊ธฐ๊ฐ’);

 

 


 

 

๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” Ref

ref๋Š” state๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ JS๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์‹œ์ ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์— ๊ด€์—ฌํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์ ํ•ฉํ•˜๋ฉฐ, ๋ฆฌ๋ Œ๋”๋ง ์‚ฌ์ด์— ๊ฐ’์„ ์ €์žฅํ•ด ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ง€์—ญ ๋ณ€์ˆ˜์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์ง์ ‘ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ref๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ๋•Œ๋Š” ref.current๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋˜๊ณ , ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. (boolean, string, number ๋“ฑ..)

 

 


 

 

์˜ˆ

 

 

alert์œผ๋กœ ๋œจ๋Š” ref.current๋Š” ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋‚˜,

spanํƒœ๊ทธ์— ์žˆ๋Š” ref.current๋Š” ๊ฐ’์ด 0์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(state๊ฐ€ ๋ฐ”๋€ ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Œ)

 

function handleStartClick() {
  const intervalId = setInterval(() => {
    // ...
  }, 1000);
  intervalRef.current = intervalId;
}

function handleStopClick() {
  const intervalId = intervalRef.current;
  clearInterval(intervalId);
}

 

์œ„์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

DOM์„ ์กฐ์ž‘ํ•˜๋Š” ref

์ผ๋ฐ˜์ ์œผ๋กœ DOM์„ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (style, focus, video๊ฐ์ฒด ๋“ฑ)

 

 


 

 

์˜ˆ

 

inputํƒœ๊ทธ ์†์„ฑ์— ref๋ฅผ ๋„ฃ์–ด์ฃผ์–ด DOM์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค..

button์„ ํด๋ฆญํ•˜์—ฌ onClick์„ ์‹คํ–‰ํ•ด ์ฃผ๋ฉด inputํƒœ๊ทธ์— focus๊ฐ€ ์žกํžˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ref๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด null๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

ulํƒœ๊ทธ์— ref๋ฅผ ์„ค์ •ํ•ด ์ฃผ๊ณ , querySelectorAll๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„ํƒœ๊ทธ์— ์ ‘๊ทผํ•˜์—ฌ ์Šคํฌ๋กค์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Tip

์žฌ์ƒ์„ฑ ๋ฐฉ์ง€

function Video() {
  const playerRef = useRef(new VideoPlayer());
  // ...

 

new VideoPlayer๊ฐ€ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์—๋งŒ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

function Video() {
  const playerRef = useRef(null);
  if (playerRef.current === null) {
    playerRef.current = new VideoPlayer();
  }
  // ...

์ดˆ๊ธฐ๊ฐ’์„ null๋กœ ์ฃผ๊ณ , ref.current์— new Videoplayer๋ฅผ ๋Œ€์ž…ํ•ด ์คŒ์œผ๋กœ์จ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Props๋กœ ref ์ „๋‹ฌํ•˜๊ธฐ

์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ, forwardRef๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•˜๋ฉด ref๋ฅผ props๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { forwardRef } from 'react';

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

export default MyInput;
const inputRef = useRef(null);

return <MyInput ref={inputRef} />;

 

 


 

 

Flag๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , ์กฐ๊ฑด์— ๋”ฐ๋ผ style์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” hook์ž…๋‹ˆ๋‹ค.

 

728x90

'Front-End > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React] Hook : useCallback  (0) 2023.06.22
React] Hook : useMemo  (0) 2023.06.20
React] Strict Mode  (0) 2023.06.20
React] Mount & Rerender (LifeSycle)  (0) 2023.06.20
React] Hook : useEffect  (0) 2023.06.20