使用过渡设置动画从待办事项列表中添加/删除项目

时间:2019-07-27 14:43:34

标签: javascript vue.js vuejs2 vuejs-transition vuejs-transition-group

我有一个待办事项清单,该清单基于官方vuejs文档中提供的示例。

示例:https://jsfiddle.net/87Lfbzng/

<ul class="todo-list">
  <li v-for="todo in filteredTodos" class="todo" :key="todo.id" :class="{ completed: todo.completed, editing: todo == editedTodo }">
    <div class="view">
      <input class="toggle" type="checkbox" v-model="todo.completed">
      <label @dblclick="editTodo(todo)">{{ todo.title }}</label>
      <button class="destroy" @click="removeTodo(todo)"></button>
    </div>
    <input class="edit" type="text" v-model="todo.title" v-todo-focus="todo == editedTodo" @blur="doneEdit(todo)" @keyup.enter="doneEdit(todo)" @keyup.esc="cancelEdit(todo)">
  </li>
</ul>

此问题是,无需动画即可立即删除/添加项目。如果我根据官方文档实施transition标签,则该标签生效。 VueJS transitions

我尝试将转换标签放在ul内,但这也不起作用。

我当前的尝试:https://jsfiddle.net/87Lfbzng/

CSS

.fade-enter-active,
.fade-leave-active {
  transition: opacity .5s;
}

.fade-enter,
.fade-leave-to
/* .fade-leave-active below version 2.1.8 */

  {
  opacity: 0;
}

标记

<transition name="fade">
  <ul class="todo-list">
    <li v-for="todo in filteredTodos" class="todo" :key="todo.id" :class="{ completed: todo.completed, editing: todo == editedTodo }">
      <div class="view">
        <input class="toggle" type="checkbox" v-model="todo.completed">
        <label @dblclick="editTodo(todo)">{{ todo.title }}</label>
        <button class="destroy" @click="removeTodo(todo)"></button>
      </div>
      <input class="edit" type="text" v-model="todo.title" v-todo-focus="todo == editedTodo" @blur="doneEdit(todo)" @keyup.enter="doneEdit(todo)" @keyup.esc="cancelEdit(todo)">
    </li>

  </ul>
</transition>

3 个答案:

答案 0 :(得分:2)

您需要将ul标记替换为transition标记。然后,将标记属性添加到transition标记,其值为 ul

<transition-group name="fade" tag="ul" class="todo-list">

https://jsfiddle.net/ducwpeam/

官方文档以ul为例:VueJs Documentation: List Moves

对此进行了介绍。

答案 1 :(得分:0)

您可以使用普通的CSS完成此操作

.view {
   animation: fade-anim 0.4s ease
}
@keyframes fade-anim {
0% {
    opacity: 0;
}
100% {
    opacity: 1;
}

}

答案 2 :(得分:0)

您只将ul包裹在transition中...这将无济于事。因为您的ul是静态的:

  

Vue提供了一个转换包装器组件,允许您在以下上下文中为任何元素或组件添加输入/离开转换:

  •   

    有条件的渲染(使用v-if)

  •   

    有条件的显示(使用v-show)

  •   

    动态组件

  •   

    组件根节点

相反,您需要将li元素包装在transition标记内,这一次它将是transition-group,因为您有两个以上的元素:

<ul>
 <transition-group name="fade">
  <li></li>
  <li></li> 
   ...
 </transition-group>
</ul>

jsfiddle