问题描述
如果我单击左侧的箭头,则存储卡应向右滚动,然后立即从左侧向后滚动。另一个按钮应该与之相反。
问题是,这里什么也没有发生。我在做什么错了?
我的模板:
<v-card>
<v-btn icon @click="back = false">
<v-icon>mdi-arrow-left</v-icon>
</v-btn>
<v-btn icon @click="back = true">
<v-icon>mdi-arrow-right</v-icon>
</v-btn>
</v-card>
<transition :name="back ? 'slide-fade' : 'slide-fade-reverse'">
<v-card max-width="200" class="mx-auto mt-5" height="80">
<span class="d-flex justify-center pt-7">{{back}}</span>
</v-card>
</transition>
我的脚本:
data() {
return {
back: false,}
},
我的CSS:
/* Prev */
.slide-fade-enter-active {
transition: all .3s ease;
}
.slide-fade-leave-active {
transition: all .3s ease;
}
.slide-fade-enter {
transform: translateX(100px);
opacity: 0;
}
.slide-fade-leave-to {
transform: translateX(-100px);
opacity: 0;
}
/* Next */
.slide-fade-reverse-enter-active {
transition: all .3s ease;
}
.slide-fade-reverse-leave-active {
transition: all .3s ease;
}
.slide-fade-reverse-enter {
transform: translateX(-100px);
opacity: 0;
}
.slide-fade-reverse-leave-to {
transform: translateX(100px);
opacity: 0;
}
我为此制造了一支钢笔:https://codepen.io/Tenarius/pen/WNwdEve
解决方法
为了使leave
和enter
过渡正常工作,<transition>
元素必须具有v-if
条件。当元素从false
变为true
时,该元素将插入DOM并根据enter
过渡进行动画处理。当条件从true
变为false
时,将执行离开过渡,并在结束时将元素从DOM中删除。
但是,您没有这样的条件。您只是在更新卡中的内容,并期望将其从DOM中删除并替换为新的内容。
为了获得预期的功能,您应该使用一系列卡(仅包含当前活动的卡),并使用<transition-group>
,该列表内部使用与transition
相同的机制但是v-if
的条件是元素是否是集合的一部分。
在您的情况下,“集合”将是一张过滤后的卡片列表,仅包含一张卡片。通过这种技术,leave元素将获得请假动画,而Entering元素将获得enter动画,因为根据模型的更改,元素实际上已被删除并添加到DOM中。
看到它工作here。
,由于过渡需要离开并进入,因此元素必须“消失”并“重新出现”,因此setTimout
可用于构建解决方法。
data() {
return {
back: false,loading: false
}
},methods: {
loadTimeout() {
this.loading = true
setTimeout(function(){
this.loading = false
}.bind(this),500);
}
}
然后可以使用v-show="!loading"
扩展卡,并且左右按钮必须调用loadTimeout()
函数。
工作示例here