Transition 전환 애니메이션
- 애니메이션 동작 전 className 만들기
- 애니메이션 동작 후 className 만들기
- className에 transition 속성 추가하기
- 원할때 2번 className 부착하기
- 예) tab state가 변할때 end 부착하기
.start{
opacity: 0;
}
.end{
opacity: 1;
transition: opacity 0.5s;
}
funtion TabContent(){
return(
<div className="start end">
{[<div>내용1</div>, <div>내용2</div>, <div>내용3</div>][tab]}
</div>
)
}
tab state가 변할때 end 부착하기
function TabContent({ tab }) {
let [fade, setFade] = useState("");
useEffect(() => {
let a = setTimeout(() => { setFade("end"); }, 100);
return () => {
clearTimeout(a);
setFade("");
};
}, [tab]);
return (
<div className={"start " + fade}>
{[<div>내용0</div>, <div>내용1</div>, <div>내용2</div>][tab]}
</div>
);
}
위와 같이 해야하는 이유
- react 18버전이상에는 새로운 기능하나가 추가 됐다
- 리액트의 automatic batching 기능
변경하는 함수들(state set함수)이 근처에 있다면 모두 하나로 합쳐서 딱 한번만 실행해준다
- 정확히 말하면, state변경함수를 쓸때마다 재렌더링을 하는게 아니라 state변경이 다 되고 나서 마지막 한번에 재렌더링을 시켜준다
- 그래서 아래의 코드처럼 코드를 짜면 한번에 state를 변경하려고 한다.
- 즉, setFade('')를 제일 먼저 공백으로 바꿨다가 setFade('end')로 바꿔주세요라는 의미인데 그냥 한번에 처리해버린다
- 그래서 위의 코드처럼 시간차를 두면 나중에 실행할 수 있으니까 의도대로 동작하게 된다
useEffect(()=>{
setFade('end')
return()=>{
setFade('')
}
}, [tab])