갈푸라떼
갈푸라떼는 개발중
갈푸라떼
전체 방문자
오늘
어제
  • 분류 전체보기 (232)
    • CS (0)
      • CSinfo (0)
    • Frontend (15)
      • HTML,CSS (1)
      • Javascript (2)
      • React (0)
      • React Hook (12)
    • Backend (0)
      • Python (0)
      • Node.js (0)
      • php (0)
    • DB (2)
      • MySQL (2)
      • BigQuery (0)
      • Mongodb (0)
    • Study (186)
      • JavaScript (72)
      • JavaScript(Clean code) (50)
      • Node.js (11)
      • HTML,CSS (13)
      • React (30)
      • TypeScript (10)
      • React-Native (0)
    • Error (2)
      • error (2)
    • Git (22)
      • Git (22)
    • Help Coding (4)
      • Useful websites (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • Github

공지사항

인기 글

태그

  • 함수
  • 상속
  • 원시타입
  • 싱글스레드
  • 인터프리터
  • structure
  • 컴파일러
  • PM2
  • ECMAScript
  • function
  • 객체타입
  • 프로토타입
  • SPREAD
  • this
  • 호이스팅
  • Babel
  • symbol
  • 정적 레벨
  • 실행 컨텍스트
  • 네이밍
  • nodemon
  • 렉시컬 환경
  • class
  • 스코프 체인
  • Arrow
  • 이터러블
  • 자바스크립트엔진
  • prototype
  • 오버라이딩
  • 심볼

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갈푸라떼

갈푸라떼는 개발중

Study/React

[React_study] 컴포넌트 전환 애니메이션 지정 (transition & automatic batch)

2022. 6. 10. 17:10

* 애니메이션 개발 단계

  1. 애니메이션 동작 전 스타일을 담아둘 className생성
  2. 애니메이션 동작 후 스타일을 담아둘 className생성
  3. transition 속성 추가
  4. 원할 때 2번 탈부착을 해준다.

* 애니메이션 예시 코드 (fade in 애니메이션 예시 코드)

  1. 애니메이션 동작 전 className 생성
  2. 애니메이션 동작 후 className 생성
  3. transition 추가
  4. 원할 때 fade-end 탈부착
.fade-start {
  opacity : 0;
}
.fade-end {
  opacity : 1;
  transition : opacity 0.5s;
}
function TabContent({tab}){

  return (
    <div className="fade-start fade-end">
      { [<div>content0</div>, <div>conten1</div>, <div>content2</div>][tab] }
    </div>
  )
}
  • useEffect를 활용해서 코드 구성 가능
  • useEffect를 사용하면 특정 state혹은 prorps가 변할 때 마다 코드가 실행이 가능하므로 활용 가능
function TabContent({tab}){

  const [tab, setTab] = useState(0);
  const [fade, setFade] = useState('');

  useEffect(()=>{
    setTImeout(()=>{ 
      setFade('fade-end') 
    },100)
    return ()=>{
      setFade('')
    }
  }, [tab])

  return (
    <div className={'fade-start ' + fade}>
      { [<div>content0</div>, <div>content1</div>, <div>content2</div>][tab] }
    </div>
  )
}
  • fade라는 state를 만들고 state에 따라서 className이 어떻게 보일지 작성후 원할 때 fade를 변경
  • tab이라는 state가 'fade-end'로 변하면 className="fade-end"로 변한다.
  • clean up function안에 fade라는 state를 공백으로 변경하게 셋팅해두었다.
  • 따라서 useEffect 실행 전엔 'fade-end'가 ' ' 이걸로 변경이 된다.

* setTimeout을 사용하는 이유

리액트 18버전 이상부터는 automatic batch라는 기능이 생겼다.

state변경함수들이 여러개 처리가 되어야 한다면

state변경함수를 다 처리하고 마지막에 한 번만 재렌더링된다.

그래서 'fade-end'로 변경하는거랑 ' ' 공백으로 변경하는거랑 약간의 시간차를 두었다.

setTimeout 말고 flushSync()를 사용해도 automatic batching를 막아준다.

'Study > React' 카테고리의 다른 글

[React_study] Redux & Redux Toolkit 셋팅 및 사용  (0) 2022.06.12
[React_study] Context API  (0) 2022.06.12
[React_study] if를 사용하지 않고 props를 사용하기  (0) 2022.06.10
[React_study] Ajax (post, fetch)  (0) 2022.06.10
[React_study] Ajax (서버와 통신)  (0) 2022.06.09
    'Study/React' 카테고리의 다른 글
    • [React_study] Redux & Redux Toolkit 셋팅 및 사용
    • [React_study] Context API
    • [React_study] if를 사용하지 않고 props를 사용하기
    • [React_study] Ajax (post, fetch)
    갈푸라떼
    갈푸라떼

    티스토리툴바