React
React 17 + TypeScript에서 onLoad 이벤트 구현 예제
오아름 샘
2025. 6. 9. 09:02
반응형
# React 17 + TypeScript에서 컴포넌트 로드 완료 시점 감지하기
React에서 컴포넌트가 완전히 로드되었을 때(마운트 완료 시) 한 번 실행되는 효과를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 `useEffect` 훅을 사용하는 것입니다.
## 1. 기본적인 컴포넌트 로드 감지 (useEffect)
import React, { useEffect } from 'react';
const ComponentLoadExample: React.FC = () => {
useEffect(() => {
// 컴포넌트가 마운트된 후 한 번 실행됩니다.
console.log('Component loaded!');
// cleanup 함수 (컴포넌트 언마운트 시 실행)
return () => {
console.log('Component will unmount!');
};
}, []); // 빈 의존성 배열은 마운트/언마운트 시에만 실행됨
return (
<div>
<h2>Component Load Detection</h2>
<p>This component has loaded.</p>
</div>
);
};
export default ComponentLoadExample;
## 2. 클래스 컴포넌트에서의 구현 (componentDidMount)
import React from 'react';
class ClassComponentLoadExample extends React.Component {
componentDidMount() {
console.log('Class component loaded!');
}
componentWillUnmount() {
console.log('Class component will unmount!');
}
render() {
return (
<div>
<h2>Class Component Load Detection</h2>
<p>This class component has loaded.</p>
</div>
);
}
}
export default ClassComponentLoadExample;
## 3. 커스텀 훅으로 구현 (재사용 가능한 로직)
import { useEffect } from 'react';
function useOnLoad(callback: () => void) {
useEffect(() => {
callback();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []); // 빈 의존성 배열로 마운트 시에만 실행
}
const ComponentWithCustomHook: React.FC = () => {
useOnLoad(() => {
console.log('Component loaded with custom hook!');
});
return (
<div>
<h2>Custom Hook Load Detection</h2>
<p>This component uses a custom onLoad hook.</p>
</div>
);
};
export default ComponentWithCustomHook;
## 4. ref를 사용한 DOM 요소 로드 감지
import React, { useEffect, useRef } from 'react';
const DomElementLoadExample: React.FC = () => {
const divRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (divRef.current) {
console.log('DOM element is now in the document!', divRef.current);
// 여기서 DOM 요소에 대한 추가 작업 수행 가능
}
}, []);
return (
<div ref={divRef}>
<h2>DOM Element Load Detection</h2>
<p>This div element has been loaded into the DOM.</p>
</div>
);
};
export default DomElementLoadExample;
## 5. 모든 자식 컴포넌트 로드 완료 감지
import React, { useEffect, useState } from 'react';
const ChildComponent: React.FC<{ onLoad: () => void }> = ({ onLoad }) => {
useEffect(() => {
// 시뮬레이션: 데이터 fetching이나 다른 비동기 작업
const timer = setTimeout(() => {
onLoad();
}, 1000);
return () => clearTimeout(timer);
}, [onLoad]);
return <div>Child Component</div>;
};
const ParentComponent: React.FC = () => {
const [loadedChildren, setLoadedChildren] = useState(0);
const totalChildren = 3;
const handleChildLoad = () => {
setLoadedChildren(prev => prev + 1);
};
useEffect(() => {
if (loadedChildren === totalChildren) {
console.log('All children components have loaded!');
}
}, [loadedChildren]);
return (
<div>
<h2>Children Load Detection</h2>
<p>Loaded {loadedChildren} of {totalChildren} children</p>
{[...Array(totalChildren)].map((_, i) => (
<ChildComponent key={i} onLoad={handleChildLoad} />
))}
</div>
);
};
export default ParentComponent;
## 6. 이미지와 같은 리소스 로드 완료 감지 (실제 onLoad 이벤트)
import React, { useState, useCallback } from 'react';
const ResourceLoadExample: React.FC = () => {
const [isLoaded, setIsLoaded] = useState(false);
const handleLoad = useCallback(() => {
console.log('Resource has loaded!');
setIsLoaded(true);
}, []);
return (
<div>
<h2>Resource Load Detection</h2>
{!isLoaded && <p>Loading resource...</p>}
<img
src="https://example.com/image.jpg"
alt="Example"
onLoad={handleLoad}
onError={() => console.error('Failed to load resource')}
style={{ display: isLoaded ? 'block' : 'none' }}
/>
</div>
);
};
export default ResourceLoadExample;
반응형