어쩌다 알게 된 ƪ(•̃͡•̃͡ ƪ

[React] useRef(), ref, forwardRef() 본문

개발/🟦 React

[React] useRef(), ref, forwardRef()

비니_ 2025. 4. 10. 21:31
728x90

 

 

 

 

✔ useRef()

=> ref 객체를 생성하는 훅

const myRef = useRef();

=> myRef { current: null } 이런 식의 객체를 만들어 줌

=> .current로 직접 접근 가능

<input ref={myRef} />

=> myRef.current는 input DOM을 가리키게 됨

** DOM: 브라우저가 화면에 그리는 실제 HTML 요소

👉 즉 화면에 뿌려진 해당 input을 뜻함

myRef.current === input

 

ex) myRef.current.focus() 가능

 

 

✔ forwardRef()

=> 컴포넌트를 받아서 → ref를 처리해주는 새 컴포넌트를 반환

=> 자식 컴포넌트가 부모에게 받은 ref를 쓸 수 있게 해주는 HOC

** HOC란?

=> 고차 컴포넌트  (Higher-Order Component)

=> 컴포넌트를 인자로 받아서, 새로운 컴포넌트를 반환하는 함수

 

고차 컴포넌트 예시) 👇

// 원래 컴포넌트
const Hello = ({ name }) => <h1>Hello, {name}!</h1>;

// HOC
const withLogging = (WrappedComponent) => {
  return (props) => {
    console.log('렌더링 됨!');
    return <WrappedComponent {...props} />;
  };
};

// HOC로 감싼 새 컴포넌트
const HelloWithLog = withLogging(Hello);

// 사용 (부모 컴포넌트 역할)
const App = () => {
  return <HelloWithLog name="React" />;
};

 

👩🏻 ** 정리

 

- withLogging: 원래 있던 컴포넌트에 props 연결을 위해 감싸주는 역할

- WrapperComponent: 원래 있던 컴포넌트

- HelloWithLog: 새 컴포넌트

 

 

 

 

forwardRef() 예시 👇

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

=> 일반 컴포넌트는 ref를 props처럼 못 받기 때문에 가능하게 하기 위래 컴포넌트를 감싸주는 역할을 forwardRef()가 하게 되며, HOC(고차 컴포넌트) 형태로 만든 것

 

 

 

- 부모 -> 자식 컴포넌트에서 ref 쓰는 예시)

✅ 부모 컴포넌트

const Parent = () => {
  const inputRef = useRef(); // 🔹 ref 객체 생성

  const focusInput = () => {
    inputRef.current.focus(); // 🔸 연결된 DOM에 직접 접근
  };

  return (
    <>
      <ChildInput ref={inputRef} /> {/* 🔸 ref 전달 */}
      <button onClick={focusInput}>Focus the input</button>
    </>
  );
};

 

✅ 자식 컴포넌트

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

 

 

 

📚 결론 📚

useRef()로 ref 객체 만든다 → ref={...}로 자식에게 전달한다 → forwardRef()로 받은 자식이 내부에서 쓴다

728x90
Comments