ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자식 컴포넌트에게 Ref 전달하기 - forwardRef
    React 2023. 4. 3. 22:09

    useRef를 통해서 자식 컴포넌트를 통제하고자 한다고 해보자.

    리액트에서 버튼을 별도의 컴포넌트로 만들어 관리하는 일은 빈번하다.

    예를 들면, 다음과 같다.

    import { useEffect, useRef } from "react";
    
    function CustomButton({ ref }) {
      return (
        <div onClick={() => window.alert("Good!")} ref={ref}>
          <h2>This is Custom Button</h2>
        </div>
      );
    }
    
    function App() {
      const testRef = useRef<HTMLDivElement>(null);
      useEffect(() => {
        console.log(testRef.current);
      }, []);
      return (
        <div>
          <p>Test Forward Ref</p>
          <CustomButton ref={testRef} />
        </div>
      );
    }
    
    export default App;

     

    그런데, 위의 코드에서는 Ref를 커스텀 컴포넌트의 하위 요소에 연결하고자 하였다.

    상위 컴포넌트에서 생성한 ref 객체를 하위 컴포넌트에 전달하면, 그대로 사용할 수 있는 것일까?

    useEffect를 사용하여 testRef 값의 변화를 감지해보지만, 변함없이 null임을 알 수 있다.

    생각처럼 props를 통해서 ref 객체를 넘겨줄 수 없는 것이다.

    Warning: CustomButton: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)

    덤으로 위와 같은 에러 메세지를 받을 수 있다.

    ref는 prop으로 전달될 수 없는 것이다.

     

    이처럼 하위 컴포넌트로 ref를 전달하기 위해서는 평범한 방법을 사용하면 안된다.

    React에서는 이러한 문제를 해결하기 위해서 forwardRef를 제공한다.

    forwardRef로 반환된 컴포넌트는 props이외에 두 번째 인자로 ref를 가질 수 있다.

    실제 사용법은 다음과 같다.

     

    import { forwardRef, useEffect, useRef } from "react";
    
    const CustomButton = forwardRef<HTMLDivElement>((props, ref) => {
      return (
        <div onClick={() => window.alert("Good!")} ref={ref}>
          <h2>This is Custom Button</h2>
        </div>
      );
    });
    
    function App() {
      const testRef = useRef<HTMLDivElement>(null);
      useEffect(() => {
        console.log(testRef.current);
      }, []);
      return (
        <div>
          <p>Test Forward Ref</p>
          <CustomButton ref={testRef} />
        </div>
      );
    }
    
    export default App;

     

    처음과 똑같이 커스텀 컴포넌트에 ref로 testRef를 전달했지만, forwardRef로 반환된 컴포넌트는 이전과는 다르게 두 번째 인자로 ref를 무사히 전달 받을 수 있는 것이다.

    <div>
    <h2>This is Custom Button</h2>
    </div>

    콘솔창에 찍히는 로그값으로 위와 같이 컴포넌트가 testRef 객체에 잘 연결되었음을 확인할 수 있다.

     

     

     

    https://ko.reactjs.org/docs/forwarding-refs.html

     

    Ref 전달하기 – React

    A JavaScript library for building user interfaces

    ko.reactjs.org

    https://reactjs.org/warnings/special-props.html

     

    Special Props Warning – React

    A JavaScript library for building user interfaces

    reactjs.org

     

Designed by Tistory.