useImperativeHandle

forwardRef 를 사용해서 ref를 사용하는 부모 컴포넌트가 자식컴포넌트에서 커스텀하게 추가된 메서드를 이용하기 위한 커스텀 훅입니다.


// parent component
import { useRef } from "react";
import ChildImperativeComponent from "./ChildImperativeComponent";

function ImperativeComponent() {
  const childCompoRef = useRef();
  const onClick = () => {
    if (childCompoRef.current) {
      console.log(
        "current name length:",
        childCompoRef.current.getNameLength()
      );
      childCompoRef.current.addAge();
    }
  };
  return (
    <div>
      <ChildImperativeComponent ref={childCompoRef} />
      <button onClick={onClick}>add age</button>
    </div>
  );
}

export default ImperativeComponent;

// children component
import React, { useState, useImperativeHandle, forwardRef } from "react";

// props와 ref를 인자로 받음
function ChildImperativeComponent(props, ref) {
  const [name, setName] = useState("");
  const [age, setAge] = useState(0);

  // 1번인자 : ref
  // 2번인자 : 현재 컴포의 값을 부모컴포가 접근할수 있는 CB함수를 전달
  useImperativeHandle(ref, () => ({
    addAge: () => setAge(age + 1),
    getNameLength: () => name.length
  }));

  return (
    <div>
      <p>{`name is ${name}`}</p>
      <p>{`age is ${age}`}</p>
    </div>
  );
}
// 여기서 forwardRef를 씌워줌으로 ref 매개변수를 사용할수 있게됨
// 부모컴포넌트에서 useRef()를 사용하고 자식의 useImprerativeHandle에 전달한 객체를 사용해 값 수정 가능
export default forwardRef(ChildImperativeComponent);

https://codesandbox.io/s/late-breeze-gtinq0?file=/src/ImperativeHandle/ChildImperativeComponent.jsx:286-305