vue.js错误的过渡组动画位置

Mus*_*mey 12 animation vuejs2

起初我是css初学者我试图为一些项目制作vue.js动画,但它运作良好,但我的动画错了

- 我们有按钮随机添加元素到数组

- 我们可以点击元素删除它

问题:

- 动画始终在最后一项上运行

我希望vue js应该在添加或删除的项目上应用动画

导致动画出错的代码有什么问题?

我应该更改或添加什么才能使动画正常工作?

new Vue({
  el: "#app",
  data: {
    myNumbers: [1, 2, 3, 4],
    highestNumberInMyNumbers: 4
  },
  methods: {
    addNumber() {
      this.highestNumberInMyNumbers++;
      this.myNumbers.splice(Math.floor(Math.random() * this.myNumbers.length), 0, this.highestNumberInMyNumbers);
    },
    removeNumber(element) {
      this.myNumbers.splice(element, 1)
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
.mix-enter {
  opacity: 0;
}

.mix-enter-active {
  transition: opacity 500ms;
  animation: mixing-in 600ms ease-in forwards;
}

.mix-leave {}

.mix-leave-active {
  transition: opacity 1000ms;
  animation: mixing-out 0.4s ease-in forwards;
  opacity: 0;
}

@keyframes mixing-in {
  from {
    transform: translateX(-20px) translateY(20px);
  }
  to {
    transform: translateX(0px) translateY(0px);
  }
}

@keyframes mixing-out {
  from {
    transform: translateX(0px) translateY(0px);
  }
  to {
    transform: translateX(-20px) translateY(-20px);
  }
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://vuejs.org/js/vue.min.js"></script>
 <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>





<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<div id="app">
  <h2>group transition for directive v-for </h2>
  <hr>
  <button @click="addNumber">Add number</button>
  <br>
  <br>
  <div class="row">
    <ul class="col-xs-4 col-sm-4 col-md-4 col-lg-4 col-xs-offset-4">
      <transition-group name="mix" mode="out-in">

        <li class="alert alert-success list-unstyled" style="height: 40px; padding: 10px 15px;margin-bottom: 8px;cursor: pointer;" v-for="(number,index) in myNumbers" @click="removeNumber(index)" :key="index">{{number}}
        </li>
      </transition-group>
    </ul>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

per*_*507 24

有一个错误transition-group!

当你将key of 绑定 liindex,每次删除a时li,动画总是发生在最后一个li元素上.

因此,如果您想使用动画li,可以在您的情况下绑定keywith number.

<transition-group name="mix"
                  mode="out-in">
    <li class="alert alert-success list-unstyled"
        style="height: 40px; padding: 10px 15px;margin-bottom: 8px;cursor: pointer;"
        v-for="(number,index) in myNumbers"
        @click="removeNumber(index)"
        :key="index">
        {{number}}
    </li>
</transition-group>
Run Code Online (Sandbox Code Playgroud)

VS

<transition-group name="mix"
                  mode="out-in">
    <li class="alert alert-success list-unstyled"
        style="height: 40px; padding: 10px 15px;margin-bottom: 8px;cursor: pointer;"
        v-for="(number,index) in myNumbers"
        @click="removeNumber(index)"
        :key="number">
        {{number}}
    </li>
</transition-group>
Run Code Online (Sandbox Code Playgroud)

最后,如果你使用动画transition-group,不要绑定keyto index,而不是itemnumber(在你的情况下).

无论如何,请确保key具有独特的价值.

  • 在这种情况下,for-loop所在的数组包含唯一的数字.但如果它包含重复的数字,这将无效.如果数组包含对象,它将起作用但你也会得到一个vuejs错误. (3认同)

小智 5

使用transition或transition-group时,请勿在v-bind:key中的任何位置使用索引

说明

vuejs.org上的食谱中存在错误/丢失文档以及错误文档,但是注释[1]中有关于索引如何工作的详细说明,但没有意识到这对于开发人员而言是一个问题。

我已经在github上发布了几次,但是那里的Vue.js开发人员充其量似乎并不屑一顾,并且拒绝记录这种行为或将其识别为问题。

复制错误/错误

下面的代码笔中有三个示例。#1有效,#2使用:key =“ index”(上面的特定错误),#3使用:key =“ item +'_'+ index”。

#2和#3给出您遇到的错误。

https://codepen.io/megacromulent/pen/wEzWNL

Codepen摘要:

这一项工作:(使用项作为:key)

<transition-group name="fade" tag="ol">
  <li v-for="(item, index) in items"
      v-bind:key="item">
    {{item}}
  </li>
</transition-group>
Run Code Online (Sandbox Code Playgroud)

失败了:(将索引用作:key)

<transition-group name="fade" tag="ol">
  <li v-for="(item, index) in items"
      v-bind:key="index" >
    {{item}}
  </li>
</transition-group>
Run Code Online (Sandbox Code Playgroud)

失败了:(将索引与字符串在:key中连接)

<transition-group name="fade" tag="ol">
  <li v-for="(item, index) in items"
      v-bind:key="item + '_' + index" >
    {{item}}
  </li>
</transition-group>
Run Code Online (Sandbox Code Playgroud)

错误报告(已拒绝)

我在此将错误报告提交给Vue.js开发人员:

“如果使用索引作为键,则过渡组仅对最后一个元素进行动画处理”

https://github.com/vuejs/vue/issues/8718

它立即关闭,因此根据他们的输入(要求我进行PR进行评论,但这不在我的舵手库中),我随后跟进了此功能请求,以使开发版本产生错误,从而可以解决问题。根。

功能要求(跟进,也被拒绝)

“在带有v-for和transitions的:key值中使用索引时,Dev构建控制台错误”

https://github.com/vuejs/vue/issues/8730

在这个问题上放一个开发错误似乎是合理的,但是vue.js开发人员似乎认为我们应该能够自己解决这个问题。我希望他们过来看看,这是一个真正的问题。这花费了我数小时的测试和报告时间才能弄清楚。

我希望这有助于其他开发者在此问题上浪费时间。

参考文献

[1] https://github.com/vuejs/vue/issues/8718#issuecomment-416909724