複數元素/元件的漸變渲染 <transition-group>
#Vue3, #VueJS3, #transition
by ChrisWong
HTML
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
<button @click="add">Generates a random number</button>
<button @click="list.length = 0">Remove all</button>
<transition-group tag="ul" class="number-list" name="list">
<li
v-for="(item, index) in list"
:key="index"
class="item"
@click="remove(index)"
>
{{ item }}
</transition-group>
</div>
SCSS
#app {
position: relative;
display: block;
padding: 1rem;
font-size: 1rem;
}
button {
font-size: 1rem;
margin-bottom: 1rem;
margin-right: 1rem;
}
.number-list {
overflow: hidden;
padding: 0;
margin-bottom: 1.5rem;
> li {
display: block;
float: left;
width: 35px;
height: 35px;
text-align: center;
line-height: 35px;
background-color: #f00;
color: #fff;
margin-right: 1rem;
margin-left: 0;
margin-bottom: 1rem;
cursor: pointer;
}
}
.list-enter-active,
.list-leave-active,
.list-move {
transition: opacity 0.7s, transform 0.7s;
}
.list-leave-active {
position: absolute;
}
.list-enter-from {
opacity: 0;
transform: translateY(-20px);
}
.list-leave-to {
opacity: 0;
transform: translateY(20px);
}
JavaScript
const app = Vue.createApp({
data() {
return {
list: [1, 2, 3, 4, 5]
}
},
methods: {
add() {
const randomNumber = Math.ceil(Math.random() * 100) + 1;
this.list.push(randomNumber);
},
remove(index) {
this.list.splice(index, 1);
},
}
});
app.mount('#app');