HTML5テクニカルノート
Vue.js入門 06: 項目を調べてデータから削除する
- ID: FN1702009
- Technique: HTML5 / JavaScript
- Library: Vue.js 2.1.10
Vue.jsのデータを書き替えると、新たな内容で表示が改められます。あらかじめ定めた条件にしたがって、データを削除してみます。
[注記] 本稿はVue.js 2.6とECMAScript 2015(ES6)にもとづく「Vue.js + ES6入門 06: 項目を調べてデータから削除する」に改訂しました。
01 ボタンを加える
「Vue.js入門 05: 項目を数えて表示する」でつくったコード001に手を加えてゆきましょう。アプリケーションに納めた複数のデータがリストとして示され、入力フィールドのテキストは「追加」ボタンで項目に加えられます。また、項目すべてとチェックのついていない数も、それぞれ示されています(図001)。
図001■全項目数と残りの数が示される
チェック済みの項目は、まとめて除けるようにしましょう。クリックする<button>
要素を、つぎのように加えます(図002)。v-on:click
ディレクティブから呼び出す関数(archive())はつぎの項で定めます。
<body>要素<div id="app" class="container"> <p> 全{{todos.length}}件中残り{{remaining}}件 <button v-on:click="archive()" class="btn btn-danger btn-xs">断捨離</button> </p> </div>
図002■件数の右にボタンが加わった
02 条件にしたがってデータを除く
ボタンから呼び出されるのは、methods
プロパティに加えたつぎのメソッド(archive())です。チェックをつけた項目は、データのプロパティ(done)の値がtrue
になります。そこで、データ(todo)の中からチェックのついていない項目を配列に取り出し、もとのデータに上書きしました。
<script>要素var app = new Vue({ el: '#app', data: { todos: [ {text: 'Vue.jsを学ぶ', done: true}, {text: 'Vue.jsでアプリケーションをつくる', done: false}, ] }, methods: { archive: function() { var remains = []; var todos = this.todos; var length = todos.length; for(var i = 0; i < length; i++) { var todo = todos[i]; if(!todo.done) { remains.push(todo); } } this.todos = remains; } }, });
これで、ボタンを押すとチェック済みの項目はデータから除かれ、画面にはチェックされていない項目だけが残ります(図003)。HTMLとJavaScriptの記述は、以下のコード001にまとめました。併せて、コードを試すためのサンプル001もその下に掲げてあります。
図003■チェック済みの項目が除かれた
コード001■条件にしたがってデータから項目を除く
<body>要素
<div id="app" class="container">
<h2>Todo</h2>
<p>
全{{todos.length}}件中残り{{remaining}}件
<button v-on:click="archive()" class="btn btn-danger btn-xs">断捨離</button>
</p>
<ul class="list-unstyled">
<li v-for="todo in todos">
<label>
<input type="checkbox" v-model="todo.done" />
<span v-bind:class="{'done': todo.done}">{{todo.text}}</span>
</label>
</li>
</ul>
<p>
<input type="text" v-model="todoText" placeholder="add new todo here" />
<button v-on:click="addTodo()" class="btn btn-primary btn-sm">追加</button>
</p>
</div>
var app = new Vue({
el: '#app',
data: {
todoText: '',
todos: [
{text: 'Vue.jsを学ぶ', done: true},
{text: 'Vue.jsでアプリケーションをつくる', done: false},
]
},
methods: {
addTodo: function() {
var newTodo = this.todoText.trim();
if (!newTodo) {return;}
this.todos.push(
{text: newTodo, done: false}
);
this.todoText = '';
},
archive: function() {
var remains = [];
var todos = this.todos;
var length = todos.length;
for(var i = 0; i < length; i++) {
var todo = todos[i];
if(!todo.done) {
remains.push(todo);
}
}
this.todos = remains;
}
},
computed: {
remaining: function() {
var count = 0;
var todos = this.todos;
var length = todos.length;
for(var i = 0; i < length; i++) {
if(!todos[i].done) {
count++;
}
}
return count;
}
}
});
サンプル001■条件にしたがってデータから項目を除く
See the Pen Vue.js: Removing Items from Data by Fumio Nonaka (@FumioNonaka) on CodePen.
03 Advanced: Vueの省略記法とECMAScript 6の構文を使う
「Vue.js入門 05: 項目を数えて表示する」のコード001は、その項04「Advanced: ECMAScript 6の構文を使う」でECMAScript 6準拠のコード002に改めました。前掲コード001も本稿で加えた処理を、同じようにECMAScript 6の構文で書いてみます。その前に、<body>
要素のHTMLコードで用いたVue.jsのディレクティブにv-on
がありましたので、つぎのように省略記法@
に書き替えましょう(「Vue.js入門 04: フィールドに入力したテキストを動的に項目として加える」03「Advanced: Vueの省略記法とECMAScript 6の構文を使う」参照)。
<body>要素<div id="app" class="container"> <p> <!--<button v-on:click="archive()" class="btn btn-danger btn-xs">断捨離</button>--> <button @click="archive()" class="btn btn-danger btn-xs">断捨離</button> </p> </div>
つぎに、JavaScriptコードです。methods
に加えたメソッド(archive())は、「: function
」を省きます。そして、for
ループの処理に替えて、Array.filter()
メソッドを使った方がすっきり書けるでしょう(「Vue.js入門 05: 項目を数えて表示する」04「Advanced: ECMAScript 6の構文を使う」参照)。つぎのように、項目リストのデータ(todos)配列から条件に合った項目の新たな配列をつくって、データに上書きします。Array.filter()
メソッドの引数は、アロー関数式=>
で与えました。
<script>要素const app = new Vue({ methods: { // archive: function() { archive() { /* var remains = []; var todos = this.todos; var length = todos.length; for(var i = 0; i < length; i++) { var todo = todos[i]; if(!todo.done) { remains.push(todo); } } this.todos = remains; */ this.todos = this.todos.filter((todo) => !todo.done); } }, });
前掲コード001をVueの省略記法とECMAScript 6の構文に改めたのが、つぎのコード002です。動きが確かめられるように、以下のサンプル002をjsdo.itに掲げました。
コード002■Vueの省略記法とECMAScript 6の構文で条件にしたがってデータから項目を除く
<body>要素
<div id="app" class="container">
<h2>Todo</h2>
<p>
全{{todos.length}}件中残り{{remaining}}件
<button @click="archive()" class="btn btn-danger btn-xs">断捨離</button>
</p>
<ul class="list-unstyled">
<li v-for="todo in todos">
<label>
<input type="checkbox" v-model="todo.done" />
<span :class="{'done': todo.done}">{{todo.text}}</span>
</label>
</li>
</ul>
<p>
<input type="text" v-model="todoText" placeholder="add new todo here" />
<button @click="addTodo()" class="btn btn-primary btn-sm">追加</button>
</p>
</div>
const app = new Vue({
el: '#app',
data: {
todoText: '',
todos: [
{text: 'Vue.jsを学ぶ', done: true},
{text: 'Vue.jsでアプリケーションをつくる', done: false},
]
},
methods: {
addTodo() {
const newTodo = this.todoText.trim();
if (!newTodo) {return;}
this.todos.push(
{text: newTodo, done: false}
);
this.todoText = '';
},
archive() {
this.todos = this.todos.filter((todo) => !todo.done);
}
},
computed: {
remaining() {
return this.todos.filter((todo) => !todo.done).length;
}
}
});
サンプル001■Vue.js + ES6: Counting items to match conditions and return the number
- Vue.js入門 01: Vue.jsを始める
- Vue.js入門 02: 要素のclass属性を動的に変える
- Vue.js入門 03: データから動的にリストをつくる
- Vue.js入門 04: フィールドに入力したテキストを動的に項目として加える
- Vue.js入門 05: 項目を数えて表示する
- Vue.js入門 07: データを項目ごとに削除する
作成者: 野中文雄
更新日: 2017年12月1日 03「Advanced: Vueの省略記法とECMAScript 6の構文を使う」を追加。
作成日: 2016年2月19日
Copyright © 2001-2017 Fumio Nonaka. All rights reserved.