【问题标题】:Apply transition to components in v-for将过渡应用于 v-for 中的组件
【发布时间】:2021-08-25 04:07:03
【问题描述】:

我一直在尝试在通过 v-for 渲染的卡片中模拟类似轮播的效果。我有一个数据数组,我有一个左旋转该数组的方法。我在 v-for 中传递了那个旋转的数组。但是,旋转的数组移动了真实的 dom div,而不是在 v-for 中重新渲染组件(我认为这就是 Vue 优化的行为方式)。我试过transition-group,但它只适用于离开和进入div的转换。有什么方法可以让我使用 Vue 转换获得类似轮播的效果(div 向上移动)?当我编写代码时,div 向上移动并按预期运行,因为当时 div 并没有在 real dom 中移动,只有 div 内的数据在发生变化,但后来它开始表现得像这样(div 在现实中移动dom)

这里是小提琴链接:https://jsfiddle.net/aanish/7pe5jq9u/4/

请帮助我实现预期的行为。

var Box =  {
  props: ['achievement'],
    template: '<transition name="slide-up"><div class="box" :key="achievement">{{achievement}}</div></transition>',
};

new Vue({
    el: '#app',
    data: {
    achievements: ['Title1', 'Title2', 'Title3', 'Title4']
  },
  created() {
    this.autoRotateArr();
  },
  components: {
    'box': Box
  },
  methods: {
    leftRotateArr() {
        this.achievements.push(
          this.achievements.shift()
    )},
    autoRotateArr() {
      this.interval = setInterval(() => this.leftRotateArr(), 3000);
    }
  }
})
.box-wrapper {
  display: flex;
  flex-direction: column;
  margin: 0 auto;
  padding: 50px;
}

.box {
  height: 50px;
  background-color: orange;
  margin: 10px 0;
}

.slide-up-enter-active {
  transition: all 666ms cubic-bezier(0, 0, 1, 1);
}

.slide-up-enter {
  transform: translateY(50px);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>


<div id="app">
  <div class="hero">
    <box :achievement="achievements[0]"></box>
  </div>
  <div class="box-wrapper">
     <div><button @click="leftRotateArr">Up</button></div>
      <box v-for="achievement in achievements" :achievement="achievement" :key="achievement"></box>
  </div>
  
</div>

.

【问题讨论】:

标签: javascript html css vue.js


【解决方案1】:

也许有mode="out-in"transition nametransition-group 的列表,请检查sn-p:

var Box =  {
  props: ['achievement'],
    template: '<transition-group name="slide-up" mode="out-in"><div class="box" :key="achievement">{{achievement}}</div></transition-group>',
};

new Vue({
    el: '#app',
    data: {
    achievements: ['Title1', 'Title2', 'Title3', 'Title4']
  },
  created() {
    this.autoRotateArr();
  },
  components: {
    'box': Box
  },
  methods: {
    leftRotateArr() {
        this.achievements.push(
          this.achievements.shift()
    )},
    autoRotateArr() {
      this.interval = setInterval(() => this.leftRotateArr(), 3000);
    }
  }
})
.hero {
    height: 50px;
}
.box-wrapper {
  display: flex;
  flex-direction: column;
  margin: 0 auto;
  padding: 50px;

}

.box {
  height: 50px;
  background-color: orange;
  margin: 10px 0;
}

.slide-up-enter-active {
  transition: all 666ms ease-out ;
}

.slide-up-enter {
  transform: translateY(50px);
}

.slide-up-leave-active {
  transition: all 0.4s ease-in;
}
.slide-up-leave-to {
  transform: translateY(-50px);
}
.slide-move {
  transition: all 0.5s ease;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>


<div id="app">
  <div class="hero">
    <box :achievement="achievements[0]"></box>
  </div>
  <div class="box-wrapper">
     <div><button @click="leftRotateArr">Up</button></div>
      <box v-for="achievement in achievements" :achievement="achievement" :key="achievement"></box>
  </div>
  
</div>

【讨论】:

  • 感谢您的帮助,但英雄部分的过渡很好。我想在 box-wrapper 内转换 box 组件,使其像旋转木马一样进行动画处理(当数组更改时,通过 box-wrapper 内的 box 组件呈现的 div 向上移动)。
  • 请查一下,伙计,这就是你要找的吗?
  • 非常感谢,伙计。这是我需要的行为:) jsfiddle.net/aanish/efcomuab/53
【解决方案2】:

在上面 Michal Levý 评论的帮助下,我得到了预期的行为 transition-group

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 2018-01-17
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多