<TransitionGroup>은 목록에서 렌더링 되는 컴포넌트나 엘리먼트의 순서에 따른 변화, 삽입, 제거에 애니메이션을 적용하기위해 디자인된 내장 컴포넌트 이다.
<Transition> 과의 차이점
<TransitionGroup>은 <Transition>과 같은 프로퍼티들과, CSS 트랜지션 클래스들과, 자바스크립트 훅리스너를 지원한다. 다른점들은 다음과 같다:
- 기본적으로, wrapper 엘리먼트를 렌더링하지 않는다. 하지만, tag 프로퍼티를 통해 렌더링될 엘리먼트를 특정할 수 있다.
- 트랜지션 모드는 사용하지 않는다. 왜냐하면, 더이상 엘리먼트를 하나를 교체하며 쓰지 안항도 되기 때문이다.
- 엘리먼트들은 유니크한 키 애트리뷰트를 항상 필요로 한다.
- CSS 트랜지션 클래스들은 그룹이나 컨테이너가 아니라 리스트의 각각의 엘리먼트들에 적용된다.
TIP
DOM 템플릿을 사용할 때, <transition-group>으로 참조된다.
삽입 / 제거 트랜지션
<TransitionGroup>을 사용한 v-for 목록에 삽입/제거 트랜지션을 적용한 예이다.
<TransitionGroup name="list" tag="ul">
<li v-for="item in items" :key="item">
{{ item }}
</li>
</TransitionGroup>
.list-enter-active,
.list-leave-active {
transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {
opacity: 0;
transform: translateX(30px);
}
이동 트랜지션
위의 데모에서는 명백한 결함이 있다: 아이템이 삽입되거나 제거될 때, 위 아래의 아이템들이 부드럽게 이동하는 대신에 즉시 "점프" 빈공간으로 점프된다. 우리는 이걸 몇가지 CSS 규칙을 추가해서 고칠 수 있다.
.list-move, /* 이동 하는 엘리먼트에 적용되는 트랜지션 */
.list-enter-active,
.list-leave-active {
transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {
opacity: 0;
transform: translateX(30px);
}
/* 남은 아이템들이 레이아웃 흐름에서 제거되게 한다.
따라서, 애니메이션들이 정확하게 게산될 수 있다. */
.list-leave-active {
position: absolute;
}
이제 보기에 더 낫다 - 리스트가 섞일때에도 부드럽게 애니메이션 된다.
Staggering 리스트 트랜지션
데이터 애트리뷰트로 자바스크립트 트랜지션과 의사소통함으로서, 목록에 stagger한 트랜지션도 가능하다. 첫째로, 돔 엘리먼트에 있는 데이터 애트리뷰트로서 아이템의 인덱스를 렌더링한다:
<TransitionGroup
tag="ul"
:css="false"
@before-enter="onBeforeEnter"
@enter="onEnter"
@leave="onLeave"
>
<li
v-for="(item, index) in computedList"
:key="item.msg"
:data-index="index"
>
{{ item.msg }}
</li>
</TransitionGroup>
그 다음, 자바스크립트 훅에서, 데이터 애트리뷰트에 기반한 딜레이로 엘리먼트를 애니메이션 할 수 있다. 예제는 애니메이션을 실행하기 위해 GreenSock 라이브러리를 사용한 것이다.
function onEnter(el, done) {
gsap.to(el, {
opacity: 1,
height: '1.6em',
delay: el.dataset.index * 0.15,
onComplete: done
})
}
'front > vue' 카테고리의 다른 글
[vue] Render Functions & JSX (1) | 2022.08.10 |
---|---|
[vue] Vue and Web Components (1) | 2022.08.09 |
[vue] Transition (0) | 2022.08.08 |
[vue] watch() (0) | 2022.08.08 |
[vue] ref, reactive 반응형 (0) | 2022.08.07 |
댓글