상위 컴포넌트에서 하위 컴포넌트의 height 값을 동적으로 구할 필요가 생김.
useImperativeHandle 와 forwardRef를 활용하여 하위 컴포넌트의 height 값을 동적으로 구할 수 있다.
useImperativeHandle 란?
상위 컴포넌트가 하위 컴포넌트의 특정 함수나 값을 호출할 수 있도록 인터페이스를 제공하는데 사용된다.
주로 ref를 전달하는 방식과 함께 사용되며, 부모 컴포넌트가 자식 컴포넌트의 내부 메서드나 값을 제어할 수 있게 만든다.
[사용 목적]
부모 컴포넌트에서 자식 컴포넌트의 특정 메서드나 속성에 접근하고자 할 때.
자식 컴포넌트의 내부 상태나 메서드를 외부로 노출할 때.
[사용 방법]
1. 하위 컴포넌트에서 forwardRef를 사용해 컴포넌트를 생성
2. useImperativeHandle 훅을 사용해 상위 컴포넌트로 노출할 메서드나 값을 정의
3. 상위 컴포넌트에서 ref를 사용해 하위 컴포넌트를 참조
하위 컴포넌트
const ChildComponent = forwardRef<ChildComponentHandle, ChildComponentProps>((props, ref) => {
const childRef = useRef<HTMLDivElement>(null); //실제 하위 컴포넌트의 DOM 요소를 참조하는 ref
//상위 컴포넌트로 노출할 메소드 정의
//컴포넌트의 높이 값을 return
useImperativeHandle(ref, () => ({
getHeight: () => {
return childRef.current?.offsetHeight || 0;
}
}));
return (
<div ref={childRef}>
<p>이것은 하위 컴포넌트입니다.</p>
</div>
);
});
export default ChildComponent;
상위 컴포넌트
import React, { useRef, useEffect } from 'react';
import ChildComponent, { ChildComponentHandle } from './ChildComponent';
const ParentComponent: React.FC = () => {
const childRef = useRef<ChildComponentHandle>(null); //하위 컴포넌트의 메소드를 전달 받는 ref
useEffect(() => {
if (childRef.current) {
const height = childRef.current.getHeight();
console.log('하위 컴포넌트의 높이:', height);
}
}, []);
return (
<div>
<h1>상위 컴포넌트</h1>
<ChildComponent ref={childRef} />
</div>
);
};
export default ParentComponent;
'TIL' 카테고리의 다른 글
SVN 기초 (4) | 2024.09.12 |
---|---|
tanstack-query(react-query) staleTime과 refetchInterval을 활용한 네트워크 요청 최소화 방법 (0) | 2024.08.12 |
nextjs/typescript lodash 에러 (0) | 2024.04.29 |
tailwind 로컬 서버랑 배포 서버의 css 우선순위가 왜 다르지? (2) | 2024.04.19 |
상위 컴포넌트에서 하위 컴포넌트로 늦게 내려오는 문제 (0) | 2024.04.18 |