Vue vue2-animate

by kabanoki

HTML

<link rel="stylesheet" href="https://unpkg.com/vue2-animate/dist/vue2-animate.min.css">
<div id="app">
    <select name="effect" class="form-control" v-model="effect"><optgroup label="Bounce"><option value="bounce">bounce</option> <option value="bounceDown">bounceDown</option> <option value="bounceLeft">bounceLeft</option> <option value="bounceRight">bounceRight</option> <option value="bounceUp">bounceUp</option></optgroup> <optgroup label="Fade"><option value="fade">fade</option> <option value="fadeDown">fadeDown</option> <option value="fadeDownBig">fadeDownBig</option> <option value="fadeLeft">fadeLeft</option> <option value="fadeLeftBig">fadeLeftBig</option> <option value="fadeRight">fadeRight</option> <option value="fadeRightBig">fadeRightBig</option> <option value="fadeUp">fadeUp</option> <option value="fadeUpBig">fadeUpBig</option></optgroup> <optgroup label="Rotate"><option value="rotate">rotate</option> <option value="rotateDownLeft">rotateDownLeft</option> <option value="rotateDownRight">rotateDownRight</option> <option value="rotateUpLeft">rotateUpLeft</option> <option value="rotateUpRight">rotateUpRight</option></optgroup> <optgroup label="Slide"><option value="slideDown">slideDown</option> <option value="slideLeft">slideLeft</option> <option value="slideRight">slideRight</option> <option value="slideUp">slideUp</option></optgroup> <optgroup label="Zoom"><option value="zoom">zoom</option> <option value="zoomDown">zoomDown</option> <option value="zoomLeft">zoomLeft</option> <option value="zoomRight">zoomRight</option> <option value="zoomUp">zoomUp</option></optgroup></select>
  <button @click="doAdd">追加</button>
  <transition-group :name="effect" tag="ul">
      <li v-for="item, index in myList" :key="item.no">
          {{item.name}}-(No.{{item.no}})
          <span class="del" v-on:click="doDelete(item, index, '')">[削除]</span>
      </li>    
  </transition-group>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>

CSS

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  padding: 10px;
  border: solid #ddd 1px;
  text-decoration: none;
  background-color: #fff;
}
.del {
  cursor:pointer;
  color: #f00;
}

Vue

new Vue({
   el: '#app',
   data: {
    effect: 'bounce', 
    items:[
      {no:1, name:'キャベツ', categoryNo:'1'},
      {no:2, name:'ステーキ', categoryNo:'2'},
      {no:3, name:'リンゴ', categoryNo:'3'}
    ],
    newNo: 4
   },
  computed: {
    myList: {
      get() {
        return this.items;
      },
      set(value) {
        this.items = value;
      }
    }
  },
  methods: {
    doAdd:function(){
      var self = this;
      var no = 0;
           
      if(self.items.concat().length > 0){
        no =  Math.max.apply(null,self.items.concat().map(function(item){return item.no;})) +1;
        self.newNo = self.newNo < no ? no:self.newNo;
      }

      this.items.push({
        no: this.newNo,
        name:'追加リスト'+ this.newNo,
        categoryNo:'5'
      });
    },
    doDelete: function(item, index){
      this.items.splice(index, 1);
    }
  }
 })