Programming/React
React FadeIn 함수 만들기 (useRef, useEffect)
Chanho.
2021. 4. 25. 11:09
반응형
실습은 codesandbox를 이용했고, 노마드코더님의 인강을 참조하고 공부 및 복습 목적으로 작성했습니다.
실습을 시작하기에 앞서 css 트랜지션을 사용하도록 하겠습니다.
transition-duration : 트랜지션이 일어나는 지속 시간을 명시하는 속성입니다.
transition-delay : 속성이 변하는 시점과 트랜지션이 실제로 시작하는 사이에 기다리는 시간을 정의합니다.
export default function App() {
return (
<div className="App">
<h1>hello!</h1>
<p>fadeIn Training</p>
</div>
);
}
시작은 화면에 h1과 p태그에 fadeIn 효과를 주도록 하겠습니다.
먼저 useFadeIn 함수를 만들고 인자값으로는 duration 과 delay 값을 받도록 하겠습니다.
const useFadeIn = (duration = 0, delay = 0) => {
if (typeof duration !== "number" || typeof duration !== "number") {
return;
}
};
이제 저희는 duration 과 delay 를 받아왔으니 hooks useRef()를 사용하여 특정 element의 DOM에 접근하도록 하겠습니다 그리고 useEffect()를 사용하여 componentDidMount와 같은 상태로 렌더링이 완료됐을 때 실행되도록 하겠습니다.
const useFadeIn = (duration = 0, delay = 0) => {
if (typeof duration !== "number" || typeof delay !== "number") {
return;
}
const element = useRef();
useEffect(() => {
if (element.current) {
const { current } = element;
console.log(current);
}
}, []);
return { ref: element };
};
<h1 {...fadeInH1}>hello!</h1>
<p {...fadeInP}>fadeIn Training</p>
위와 같이 작성하고 console.log로 current 값을 확인해보면 해당 태그가 콘솔창에 출력되는 것을 알 수 있습니다.
이제 정상적으로 element의 current 값들을 가져오는 것을 확인했으니 실제 current에 style을 추가하도록 하겠습니다.
const useFadeIn = (duration = 0, delay = 0) => {
if (typeof duration !== "number" || typeof delay !== "number") {
return;
}
const element = useRef();
useEffect(() => {
if (element.current) {
const { current } = element;
current.style.transition = `opacity ${duration}s ${delay}s`;
current.style.opacity = 1;
}
}, []);
return { ref: element, style: { opacity: 0 } };
};
전체적인 코드
import React, { useEffect, useRef } from "react";
import "./styles.css";
const useFadeIn = (duration = 0, delay = 0) => {
if (typeof duration !== "number" || typeof delay !== "number") {
return;
}
const element = useRef();
useEffect(() => {
if (element.current) {
const { current } = element;
current.style.transition = `opacity ${duration}s ${delay}s`;
current.style.opacity = 1;
}
}, []);
return { ref: element, style: { opacity: 0 } };
};
export default function App() {
const fadeInH1 = useFadeIn(3, 2);
const fadeInP = useFadeIn(4, 2);
return (
<div className="App">
<h1 {...fadeInH1}>hello!</h1>
<p {...fadeInP}>fadeIn Training</p>
</div>
);
}