Skip to content

TransitionGroup

<TransitionGroup> là một thành phần tích hợp được thiết kế để tạo hiệu ứng cho việc chèn, xóa, và thay đổi thứ tự của các phần tử hoặc thành phần được render trong một danh sách.

Sự Khác Biệt so với <Transition>

<TransitionGroup> hỗ trợ các thuộc tính, lớp chuyển động CSS, và lắng nghe sự kiện hook JavaScript giống như <Transition>, với những khác biệt sau đây:

  • Mặc định, nó không render một phần tử bao. Nhưng bạn có thể chỉ định một phần tử để render bằng cách sử dụng prop tag.

  • Chế độ chuyển động không khả dụng, vì chúng ta không còn xen kẽ giữa các phần tử tương đối độc lập.

  • Các phần tử bên trong luôn bắt buộc phải có một thuộc tính key duy nhất.

  • Các lớp chuyển động CSS sẽ được áp dụng cho từng phần tử trong danh sách, không phải cho nhóm/container chính nó.

TIP

Khi sử dụng trong mẫu in-DOM, nó nên được tham chiếu là <transition-group>.

Chuyển Động Nhập / Rời

Dưới đây là một ví dụ về cách áp dụng chuyển động nhập / rời cho danh sách v-for bằng cách sử dụng <TransitionGroup>:

template
<TransitionGroup name="list" tag="ul">
  <li v-for="item in items" :key="item">
    {{ item }}
  </li>
</TransitionGroup>
css
.list-enter-active,
.list-leave-active {
  transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}
  • 1
  • 2
  • 3
  • 4
  • 5

Chuyển Động Di Chuyển

Đoạn mã trên có một số điểm yếu rõ ràng: khi một phần tử được chèn hoặc xóa, các phần tử xung quanh nó ngay lập tức "nhảy" vào vị trí thay vì di chuyển mượt mà. Chúng ta có thể sửa điều này bằng cách thêm một số quy tắc CSS bổ sung:

css
.list-move, /* áp dụng chuyển động cho các phần tử di chuyển */
.list-enter-active,
.list-leave-active {
  transition: all 0.5s ease;
}

.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}

/* đảm bảo rằng các phần tử rời khỏi layout flow để chuyển động
   di chuyển có thể được tính toán đúng cách. */
.list-leave-active {
  position: absolute;
}

Bây giờ nó trông tốt hơn nhiều - thậm chí có hiệu ứng mượt mà khi toàn bộ danh sách được xáo trộn:

  • 1
  • 2
  • 3
  • 4
  • 5

Ví dụ đầy đủ

Chuyển Động Động Các Phần Tử Trong Danh Sách

Bằng cách giao tiếp với các chuyển động JavaScript thông qua các thuộc tính dữ liệu, cũng có thể làm trì hoãn chuyển động trong một danh sách. Trước hết, chúng ta render chỉ số của một phần tử như một thuộc tính dữ liệu trên phần tử DOM:

template
<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>

Sau đó, trong các hook JavaScript, chúng ta thực hiện chuyển động cho phần tử với độ trễ dựa trên thuộc tính dữ liệu. Ví dụ này đang sử dụng thư viện GreenSock để thực hiện animation:

js
function onEnter(el, done) {
  gsap.to(el, {
    opacity: 1,
    height: '1.6em',
    delay: el.dataset.index * 0.15,
    onComplete: done
  })
}
  • Bruce Lee
  • Jackie Chan
  • Chuck Norris
  • Jet Li
  • Kung Fury
TransitionGroup has loaded