ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react hook

useImperativeHandle

dev_been94 2024. 12. 14. 12:05
728x90
๋ฐ˜์‘ํ˜•

useImperativeHandle

 

๐ŸŽฏ useImperativeHandle์€ ๋ฌด์—‡์ผ๊นŒ์š”?

**useImperativeHandle**์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๋„๊ตฌ์˜ˆ์š”.

์ผ๋ฐ˜์ ์œผ๋กœ React์—์„œ๋Š” ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ์ œ์–ดํ•  ๋•Œ props๋ฅผ ์‚ฌ์šฉํ•˜์ž–์•„์š”?
๊ทธ๋Ÿฐ๋ฐ ๋•Œ๋กœ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ํŠน์ • ํ•จ์ˆ˜๋‚˜ ๊ฐ’์„ ๋ถ€๋ชจ๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”.

์ด๋•Œ useImperativeHandle์„ ์‚ฌ์šฉํ•˜๋ฉด
๋ถ€๋ชจ๊ฐ€ ์ž์‹์˜ ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ๋…ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์š”.

 

๐Ÿ“ž ๋น„์œ : ๋ฆฌ๋ชจ์ปจ๊ณผ ํ…”๋ ˆ๋น„์ „

ํ…”๋ ˆ๋น„์ „์„ ์ƒ์ƒํ•ด๋ณผ๊นŒ์š”? ๐Ÿ“บ

  • ํ…”๋ ˆ๋น„์ „(์ž์‹ ์ปดํฌ๋„ŒํŠธ) ์•ˆ์—๋Š” ๋ณผ๋ฅจ, ์ฑ„๋„ ๋ณ€๊ฒฝ, ์ „์› ๋„๊ธฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์š”.
  • ๊ทธ๋Ÿฐ๋ฐ **๋ฆฌ๋ชจ์ปจ(๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ)**์„ ํ†ตํ•ด์„œ๋Š” ๋ณผ๋ฅจ ์กฐ์ ˆ์ด๋‚˜ ์ „์› ๋„๊ธฐ ๊ฐ™์€ ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ฃ .

React์˜ **useImperativeHandle**์€ ์ด๋Ÿฐ ๋ฆฌ๋ชจ์ปจ ์—ญํ• ์„ ํ•ด์š”.
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ค ์ œ์–ดํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
๋…ธ์ถœํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ๋งŒ ์„ ํƒํ•ด์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š” ๊ฑฐ์˜ˆ์š”.

 

๐Ÿ› ๏ธ ๊ธฐ๋ณธ ์˜ˆ์ œ: useImperativeHandle ์‚ฌ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด useImperativeHandle์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

1. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜๊ธฐ

import React, { useRef, useImperativeHandle, forwardRef } from "react";

// ์ž์‹ ์ปดํฌ๋„ŒํŠธ
const ChildComponent = forwardRef((props, ref) => {
  // ๋‚ด๋ถ€์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค
  const sayHello = () => alert("์•ˆ๋…•ํ•˜์„ธ์š”! ๐Ÿ‘‹");
  const sayGoodbye = () => alert("์•ˆ๋…•ํžˆ ๊ฐ€์„ธ์š”! ๐Ÿ‘‹");

  // ๋ถ€๋ชจ๊ฐ€ ์ ‘๊ทผํ•  ๊ธฐ๋Šฅ์„ ๋…ธ์ถœ (๋ฆฌ๋ชจ์ปจ์— ๋„ฃ์–ด์ค„ ๊ธฐ๋Šฅ)
  useImperativeHandle(ref, () => ({
    sayHello,
  }));

  return <div>์—ฌ๊ธฐ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.</div>;
});

export default ChildComponent;

 

2. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹์˜ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๊ธฐ

import React, { useRef } from "react";
import ChildComponent from "./ChildComponent";

function ParentComponent() {
  const childRef = useRef(null); // ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ์กฐํ•  ref ์ƒ์„ฑ

  const handleClick = () => {
    childRef.current.sayHello(); // ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ sayHello ํ•จ์ˆ˜ ํ˜ธ์ถœ
  };

  return (
    <div>
      <h1>๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ</h1>
      <ChildComponent ref={childRef} />
      <button onClick={handleClick}>์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ ์‹คํ–‰ํ•˜๊ธฐ</button>
    </div>
  );
}

export default ParentComponent;

 

๐Ÿ” ์ฝ”๋“œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?

  1. forwardRef
    • ChildComponent๋ฅผ ๊ฐ์‹ธ์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์š”.
  2. useImperativeHandle
    • ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ถ€๋ชจ์—๊ฒŒ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์„ ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌํ•ด์š”.
    • ์œ„ ์˜ˆ์ œ์—์„œ๋Š” sayHello๋งŒ ๋ถ€๋ชจ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ์ถœํ–ˆ์–ด์š”.
    • sayGoodbye๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋‹ˆ๊นŒ ๋ถ€๋ชจ๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”.
  3. ref๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ ํ˜ธ์ถœ
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ childRef.current.sayHello()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด
      ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ sayHello ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ผ์š”.

 

๐ŸŽฎ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ• ๊นŒ์š”?

**useImperativeHandle**์€ ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ด์š”:

  1. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ๋ถ€๋ชจ์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋‹ฌ์ฐฝ ์—ด๊ณ  ๋‹ซ๊ธฐ, ํฌ์ปค์Šค ์ด๋™ํ•˜๊ธฐ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค.
  2. DOM ์š”์†Œ์— ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ
    • input์ด๋‚˜ button ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ํฌ์ปค์Šค๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ.

 

๐Ÿงฉ ์˜ˆ์ œ: ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ input์— ํฌ์ปค์Šค ์ฃผ๊ธฐ

import React, { useRef, useImperativeHandle, forwardRef } from "react";

const InputField = forwardRef((props, ref) => {
  const inputRef = useRef();

  useImperativeHandle(ref, () => ({
    focusInput: () => inputRef.current.focus(),
  }));

  return <input ref={inputRef} placeholder="์—ฌ๊ธฐ์— ์ž…๋ ฅํ•˜์„ธ์š”" />;
});

function App() {
  const inputFieldRef = useRef();

  const handleFocus = () => {
    inputFieldRef.current.focusInput();
  };

  return (
    <div>
      <InputField ref={inputFieldRef} />
      <button onClick={handleFocus}>์ž…๋ ฅ์ฐฝ์— ํฌ์ปค์Šค ์ฃผ๊ธฐ</button>
    </div>
  );
}

export default App;

 

์„ค๋ช…:

  • useImperativeHandle์„ ํ†ตํ•ด focusInput์ด๋ผ๋Š” ๊ธฐ๋Šฅ๋งŒ ๋ถ€๋ชจ์—๊ฒŒ ๋…ธ์ถœํ–ˆ์–ด์š”.
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด input์— ํฌ์ปค์Šค๊ฐ€ ๊ฐ€๋„๋ก ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ฃ .

 

๐Ÿš€ ์ •๋ฆฌํ•˜์ž๋ฉด!

useImperativeHandle์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”.
์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ , ๋”ฑ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด์—์š”!

728x90
๋ฐ˜์‘ํ˜•

'web > react hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

useLayoutEffect  (0) 2024.12.14
useInsertionEffect  (0) 2024.12.14
useId  (0) 2024.12.14
useEffect  (1) 2024.12.14
useDeferredValue  (0) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250