REACT_HOOKS useRef사용해서 fade-in /out 애니메이션 만들기
포스팅 이어서 하기 전 개념정리
useRef란
Hooks의 함수 중 하나로, DOM에 직접적으로 접근할 때 사용한다. (element.current) state가 바뀌거나, 어떤 이슈가 발생해도 리렌더링이 되지 않는다. JS에서 돔에 직접적으로 접근해 무언가를 처리 할 event를 사용할 때 useRef를 많이 사용한다.
애니메이션을 직접적으로 사용할 때
- custom hook 생성
DOM에 직접 접근하는 useRef만들기 -> 애니메이션에 필요한 변수 타입 체크 -> useEffect를 사용해 DOM에서 처리할 코드 작성 => return값으로 ref, style- return값을 ref,style로 지정하면 spread operator로 따로 메서드로 넣지 않아도됨!
custom hook 생성
//useScrollFadeIn.jsx
import { useEffect, useRef } from "react";
const useFadeIn = (duration,delay) =>{
const element= useRef();
//element 접근 useRef
if(typeof duration!== 'number' && typeof delay!== 'number' ) return;
//type check
useEffect(() => {
if(element.current){
const {current}= element;
current.style.transition= `opacity ${duration}s ${delay}s`;
current.style.opacity= 1;
}
},[duration,delay])
//접근했을 때 opacity사용해서 애니메이션 효과
//duration,delay가 변경될때마다 렌더링
return {
ref:element,
style:{opacity:0}
}
}
export default useFadeIn;
//MainPage.jsx
import useFadeIn from "./useScrollFadeIn";
export default function MainPage(){
const titleFadeIn= useFadeIn(2,1);
return <div>
<h2 {...titleFadeIn} >Testing Scroll Animation Using useRef</h2>
</div>
}
React 읽는 순서
1. MainPage useFadeIn(2,1) 읽기
2. useFadeIn return
3. MainPage render
4. useFadeIn useEffect
5. useEffect 조건문
Fade-out 코드
- setTimeout으로 opacity 0 으로 만들기
//useFadeIn.jsx
const useFadeIn = (duration, delay) => {
const element = useRef();
if (typeof duration !== "number" && typeof delay !== "number") return;
useEffect(() => {
if (element.current) {
console.log('active1')
const { current } = element;
current.style.transition = `opacity ${duration}s ${delay}s`;
current.style.opacity = 1;
setTimeout(() => {
current.style.opacity = 0;
},parseInt(`${duration}000`))
//duration실행 뒤 opacity0으로 만들고, parseInt로 문자열 숫자로 바꾸기
}
}, [duration, delay]);
return {
ref: element,
style: { opacity: 0 }
};
};
scroll위치에 도달했을 때 animation시작
//useScrollFadeIn.jsx
import { useEffect, useRef } from "react";
const useFadeIn = (duration, delay) => {
if (typeof duration !== "number" && typeof delay !== "number") return;
//타입체크
const element = useRef();
const fadeAnimation = () => {
const { current } = element;
current.style.transition = `opacity ${duration}s ${delay}s`;
current.style.opacity = 1;
setTimeout(() => {
current.style.opacity = 0;
}, parseInt(`${duration}000`));
};
//fadeIn - fadeOut 함수
useEffect(() => {
const elemPosition = element.current.clientTop;
window.addEventListener("scroll", () => {
const currentScroll = window.pageYOffset;
if (currentScroll >= elemPosition && element.current) {
fadeAnimation();
//스크롤 위치 element보다 아래있고, element가 undefined가 아닐때 애니메이션 실행
}
});
}, []);
return {
ref: element,
style: { opacity: 0 }
};
};
export default useFadeIn;
문제가 있음.. 애니메이션 무한반복됨.. state값으로 처리해야 할 것 같은데 머리가 아픔 ^^;;
참조 / 출처
- https://studyingych.tistory.com/64 [React FadeIn 함수만들기]
- https://ko.reactjs.org/docs/hooks-reference.html#useref [공홈]
- https://yoonjong-park.tistory.com/entry/React-useRef-%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80
[[React] useRef() 는 언제 사용하는가?] - https://devrappers.tistory.com/55 [useRef]
- https://flyingsquirrel.medium.com/react-%EC%BD%94%EB%93%9C-%EA%B9%8C%EB%B3%B4%EA%B8%B0-useref%EB%8A%94-dom%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%A0-%EB%95%8C-%EB%BF%90%EB%A7%8C-%EC%95%84%EB%8B%88%EB%9D%BC-%EB%8B%A4%EC%96%91%ED%95%98%EA%B2%8C-%EC%9D%91%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EC%96%B4%EC%9A%94-f0359ad23f3b [나중에 볼 포스팅 - React코드 까보기 (useRef)]
Author And Source
이 문제에 관하여(REACT_HOOKS useRef사용해서 fade-in /out 애니메이션 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@holicholicpop/REACTHOOKS-useRef사용해서-fade-in-out-애니메이션-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)