目次
環境
vue.js :
はじめに
最近Vue.jsの記事を書く機会増えてきました。
今回は、Vue.jsのリストフィルタを使った時に、チェックボックスのチェックが外れてしまうのに対応します。
checkedの維持
Vue
new Vue({ el: '#app', data: { items: [ {no:1, name:'キャベツ', categoryNo:'1'}, {no:2, name:'ステーキ', categoryNo:'2'}, {no:3, name:'リンゴ', categoryNo:'3'}, {no:4, name:'冷蔵庫', categoryNo:'4'}, {no:5, name:'きゅうり', categoryNo:'1'}, {no:6, name:'ハンバーグ', categoryNo:'2'}, {no:7, name:'バナナ', categoryNo:'3'}, {no:8, name:'PS4', categoryNo:'4'}, ], categoryItems: [ {no:1, name:'野菜'}, {no:2, name:'肉'}, {no:3, name:'果物'}, {no:4, name:'その他'}, ], search: '', selectCategory:'', }, methods:{ setChecked: function(key, event) { var self = this; for(var i in self.items) { if(self.items[i]['no'] == event.target.value) { if(event.target.checked == true) { self.items[i][key] = 1; } else { self.items[i][key] = 0; } break; } } }, setValue: function(key, index, event){ var self = this; self.items[index][key] = event.target.value; }, defChecked: function (item){ if(item.checked == 1) return true; else return false; } }, computed: { getItems: { get: function () { var self = this; return self.items.filter(function (item) { return ( (item.name.indexOf(self.search) !== -1) && (item.categoryNo.indexOf(self.selectCategory) !== -1) ); }); }, set: function (v) { this.items = v; } }, getCategoryItems: { get: function () { var self = this; return self.categoryItems; }, set: function (v) { this.items = v; } }, }, });
HTML
<div id="app" class="content" style="padding:40px"> <div class=row> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"> <div class="checkbox" v-for="(item, index) in getItems"> <label> <input type="checkbox" v-on:click="setChecked('checked', $event)" v-bind:value="item.no" v-bind:checked="defChecked(item)"> {{item.name}} </label> </div> </div> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"> <div class="form-group"> <label for="exampleInputEmail1">テキスト絞込み</label> <input type="text" v-model="search" class="form-control" id="exampleInputEmail1" placeholder="Email"> </div> <div class="form-group"> <label for="exampleInputEmail1">カテゴリー選択</label> <select class="form-control" v-model="selectCategory"> <option value="">選択</option> <option v-for="(item, index) in getCategoryItems" v-bind:value="item.no">{{item.name}}</option> </select> </div> </div> </div> </div>
デモ
checkedを保持する
Vueでフィルタリングをすると、リストのアイテムが削除されてしまいます。
なので、フィルターを解除するとアイテムが再生成されて、チェックボックスが空の状態になってしまいます。
そこで、以下のソースでcheckedをアイテムに持たせてしまいます。
Vue
setChecked: function(key, event) { var self = this; for(var i in self.items) { if(self.items[i]['no'] == event.target.value) { if(event.target.checked == true) { self.items[i][key] = 1; } else { self.items[i][key] = 0; } break; } } }
HTML
v-on:click="setChecked('checked', $event)"
チェックを反映させる
checkedをアイテムに記録できたら、以下のソースで再生成時にcheckedを反映させます。
Vue
setChecked: function(key, event) { var self = this; for(var i in self.items) { if(self.items[i]['no'] == event.target.value) { if(event.target.checked == true) { self.items[i][key] = 1; } else { self.items[i][key] = 0; } break; } } }
HTML
v-bind:checked="defChecked(item)"
どうでしょうか?
今日はこの辺でー