ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 221214 TIL(useImperativeHandler)
    하루 30분 TIL 2022. 12. 14. 21:26
    useImperativeHandle customizes the instance value that is exposed to parent components when using ref...
    useImperativeHandle should be used with forwardRef:

    useImperativeHandler은 거의 사용할 일도 없고 리액트 문서에서 사용을 지양하라는 훅이라 익숙하지 않다. 

    (하지만 때로는 권장하지 않더라도 사용해야 할 때가 있고 그 때 다양하게 알고 있는 게 힘이 된다.)

     

    여튼 이 훅은 설명만 보면 도통 무슨 말인지 알기 힘들다. 

    ref를 사용할 때 부모의 컴포넌트에 노출되는 인스턴스 값을 커스텀하고 forwardRef와 함께 사용된다고 한다. 

     

    우선 useRef와 fowardRef를 알아보자.

     

    1. 특정 돔에 접근할 때 useRef라는 리액트 훅을 사용하여 간단하 DOM 조작할 수 있다.

    2. 이때 자신의 컴포넌트가 아닌 부모가 자식의 DOM에 접근할 때 fowardRef를 사용할 있다(props명을 ref로 쓰지 않는다면 안써도 됨)

     

    그렇다면 useImperativeHandler는 무엇인가? 

    useImperativeHandler는 2번에서 자식 컴포넌트에서도 그 DOM요소에 접근하고 싶을 때 쓰는 훅이다.

    const Child = forwardRef((props, ref)) => {
      const inputRef = useRef();
      useImperativeHandle(ref, () => inputRef.current);
    
      return (
        <div>
          ...
          <input ref={ref} />
        </div>
      )
    })

     

    useImperativeHandler 훅을 통해 부모에서 사용하는 ref를  input.current로 반환하는 것이다. 

    즉 처음으로 돌아가서 공식 문서에서 정의된 "부모 컴포넌트에 노출되는 인스턴스 값을 커스텀 한다" 의 의미가 이것이다. 

     

    장점은 ?

     

    useImperativeHandler 훅을 사용해 인스턴스 값을 커스텀할 수 있는데 이때 사용처인 부모는 해당 커스텀의 구체적인 내용을 알 필요 없사용할 수 있다. 이때, 자식 컴포넌트의 상태나 로직을 isolate할 수 있다는 장점이 생긴다.

    리액트에서는 일방향의 데이터 흐름을 가지는데 그것을 피하기위해 Redux나 Context API를 사용한다.

    하지만 그 것들을 사용할 만큼의 일이 아닐 때 useImperativeHandler을 사용할 수도 있다.

    상태나 로직을 자식 컴포넌트가 갖거 있고 부모 컴포넌트는 자식 컴포넌트에서 정의한 프로퍼티를 사용하기만 하면 된다.

     

    어떨때 쓰이는가 ?

    Ref를 이용하는 자체가 권장되는 사용은 아니지만 혹시나 라이브러리를 wrapping 할때, 혹은 부모에게 자식의 메서드를 넘겨야하는 상황이 발생 할때 useImperativeHandle 는 유용하게 사용할 곳이 많을 것 같다.

     

     

    Ref)

    1. [React] useImperativeHandle

    2. https://kelly-kh-woo.medium.com/react-hook-useimperativehandle-89fee716d80

    3. https://developer-alle.tistory.com/372

     

     

    '하루 30분 TIL' 카테고리의 다른 글

    2301112 30분 TIL (a태그 noopener noreferrer / SOLID)  (0) 2023.01.13
    221220 TIL(useRef)  (0) 2022.12.20
    221208 TIL(uncontrolled vs controlled)  (0) 2022.12.09
    221103 TIL  (0) 2022.11.04
    221102 TIL(Attrs)  (0) 2022.11.02

    댓글

Designed by Tistory.