Open In App

Vue.js Staggering List Transitions

Vue.js is a progressive javascript framework for developing web user interfaces. It is a versatile framework providing high speed and performance.  We can create Single Page Applications as well as Full Stack applications.

Staggering List Transitions can be performed in the lists by communicating between the javascript transition and data attributes present. TransitionGroup is used to perform the staggering list transitions. TransitionGroup is the built-in element of the Vue.js designed for animating the insertion, deletion, and order change of the elements in the list.



Staggering List Transitions classes for TransitionGroup:

All the events work independently and hence the transition is staggering.



Syntax: Define the methods for animation on different events and then attach the callbacks to the TransitionGroup element as follows:

<TransitionGroup
 tag="ul"
 @before-enter="onBeforeEnter"
 @enter="onEnter"
 @leave="onLeave">
 <li
   v-for="(item, index) in computedList"
   :key="item.tutorial"
   :data-index="index">
    {{ item.tutorial }}
 </li>
</TransitionGroup>

Example: In the following example, we have a list with a search bar above it. Whenever a search query is entered, the list is filtered and the animations for removal and filtering are performed. 

First, we have installed the gsap for transition animations. It is a library for animations. Install it using the following command.

npm i gsap

And then, use the following codes for the respective files for animation.




<script>
import gsap from "gsap";
export default {
  data() {
    return {
      tutorials: [
        "Data Structures",
        "Competitive Programming",
        "Machine Learning",
        "Java",
        "Interview preparation",],
        search: "",};
  },
  computed: {
    newList() {
      return this.tutorials.filter((object) =>
        object.toLowerCase().includes(this.search)
      );
    },
  },
  methods: {
    onBeforeEnter(element) {
      element.style.height = 0;
      element.style.opacity = 0;
    },
    onEnter(element, done) {
      gsap.to(element, {
        fontSize: "1em",
        height: "1.6em",
        opacity: 1,
        onComplete: done,
      });
    },
    onLeave(element, done) {
      gsap.to(element, {
        opacity: 0,
        onComplete: done,
      });
    },
  },
};
</script>
  
<template>
  <center>
    <h1 style="text-align: center;
        color: green">GeeksforGeeks
    </h1>
    <strong>
        Vue.js Staggering List Transitions
    </strong>
    <br />
    <input v-model="search" 
           placeholder="Search tutorials" 
           type="text" />
  </center>
  <div style="margin-left: auto; 
                margin-right: auto; 
                width: 40vw">
    <TransitionGroup
      tag="ul"
      style="list-style-type: none"
      @before-enter="onBeforeEnter"
      @enter="onEnter"
      @leave="onLeave">
      <li
        v-for="(object, item_index) in newList"
        :key="object"
        :data-index="item_index"
        style="height: 1.6em">
            {{ object }}
      </li>
    </TransitionGroup>
  </div>
</template>




import { createApp } from "vue";
import App from "./App.vue";
  
createApp(App).mount("#app");

Output:

 

Reference: https://vuejs.org/guide/built-ins/transition-group.html#staggering-list-transitions


Article Tags :