javascript - Vue 过渡模式与 v-for 和 v-if 结合使用时不起作用

标签 javascript vue.js transition vuetify.js animate.css

在使用 Vuetify 的 Vue 中,我想使用 animate.css 动态更改 v-cards,但我遇到了问题。 out-in 模式不希望在这种情况下工作。淡入和淡出动画同时移动。如何强制它在结束淡入后开始淡入动画?

new Vue({
  el: '#app',
  data() {
    return {
      number: 1,
      items: [
        {
          text: "a",
          number: 1
        },
        {
          text: "b",
          number: 2
        },
        {
          text: "c",
          number: 3
        },
      ]
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script><script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet"/>
<link href="https://cdn.jsdelivr.net/npm/animate.css" rel="stylesheet"/>

<div id="app">
  <div v-for="(item, index) in items" :key="index">
    <transition mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="animated slideOutRight">
      <v-card dark class="ma-3" v-if="number === item.number">
        <p>{{item.text}}</p>
      </v-card>
    </transition>
  </div>
  <br>
  <v-btn @click="number++; if(number === 4) number = 1;">Next</v-btn>
</div>

https://codepen.io/km2442/pen/zgmmwz

最佳答案

出了什么问题?

您的转换位于循环内,这意味着渲染后您将有多个 transitions彼此没有关系(mode不起作用)...这是您的模板渲染后的样子:

<div key="0">
    <transition mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="animated slideOutRight">
      <v-card dark class="ma-3" v-if="true">
        <p>a</p>
      </v-card>
    </transition>
 </div>
 <div key="1">
    <transition mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="animated slideOutRight">
     <!-- <v-card dark class="ma-3" v-if="false">
        <p>b</p>
      </v-card> -->
    </transition>
 </div>
 <div key="2">
    <transition mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="animated slideOutRight">
      <!-- <v-card dark class="ma-3" v-if="false">
        <p>c</p>
      </v-card> --> 
    </transition>
 </div>
 <div key="3">
    <transition mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="animated slideOutRight">
      <!-- <v-card dark class="ma-3" v-if="false">
        <p>d</p>
      </v-card> -->
    </transition>
 </div>

因此,当您按“下一步”时,您将从一个过渡跳到另一个过渡......在本例中为 mode丢失了。

我如何解决这个问题?

我们只需要将整个项目包装在一个过渡中,因此在本例中只有一个 transition这将检测一个元素何时出去以及一个新元素进入(mode将起作用):

Vue.config.devtools = false;
Vue.config.productionTip = false;

new Vue({
  el: '#app',
  data() {
    return {
      number: 1,
      items: [{
          text: "a",
          number: 1
        },
        {
          text: "b",
          number: 2
        },
        {
          text: "c",
          number: 3
        },
      ]
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/animate.css" rel="stylesheet" />

<div id="app">
  <transition mode="out-in" enter-active-class="animated slideInLeft" leave-active-class="animated slideOutRight">
    <template v-for="(item, index) in items">
      <v-card dark class="ma-3" v-if="number === item.number" :key="index">
        <p>{{item.text}}</p>
      </v-card>
  </template>
  </transition>
  <br>
  <v-btn @click="number++; if(number === 4) number = 1;">Next</v-btn>
</div>

关于javascript - Vue 过渡模式与 v-for 和 v-if 结合使用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57453977/

相关文章:

javascript - 使用 anchor 作为提交输入时在输入/返回时提交表单

javascript - 在 vue.js 中显示原始图像内容类型

html - 带 anchor 的 CSS3 过渡

jQuery html 过渡

Android:clipChildren=false 和 onClickListner 用于剪裁的 child

javascript - 如何从正则表达式中删除全局标志?

javascript - TypeError : g. rangy.saveSelection 不是使用 textangular + rangy + browserify 的函数

javascript - 在具有单独服务的 Vue.js 中使用 axios?

javascript - 有没有一种很好的方法可以将基于 JQuery 的小部件包装到一个可以在 Vue.js 中轻松使用的模块中?

javascript - 重置(撤消)添加表行操作 JQUERY