はじめに
Vue.jsの基本的な使い方まとめの続きです。
チュートリアルの鉄板であるTO DOアプリを作成していきます。
テンプレートを用意する
雛形となるHTMLとJSを作成します。
todo
ディレクトリを作成して、その中にindex.html
とindex.js
を作成します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>TO DOアプリ</title>
</head>
<body>
<div id="app">
<!-- ここにVueインスタンスを展開する -->
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js"></script>
<script src="./index.js"></script>
</body>
</html>
続いてVueインスタンスを作成する。
var app = new Vue({
el: '#app'
})
入力フォームとメソッドの追加
form
要素の中に入力フォームとボタンを追加する。
<div id="app">
<h2>TODO List</h2>
<form>
<input type="text">
<button>
追加
</button>
</form>
</div>
続いてbutton
要素にv-on:click
を設定する。
buttonがクリックされたらaddItem
メソッドを呼び出す。
<button v-on:click="addItem">
VueインスタンスにaddItem
メソッドを記述する。
一旦、正常に動いているか確認するため、アラートを表示させてみる。
var app = new Vue({
el: '#app',
// メソッド定義
methods: {
addItem: function(event) {
alert()
}
}
})
次にbutton
をクリックした時にsubmit
イベントが発動して、ページがリロードされるのを防ぐ処理をform
に記述する。
prevent
はデフォルトの動作を停止させる。
<form v-on:submit.prevent>
TO DOリストにタスクを登録
input要素にv-model
を記述して双方向データバインディング出来るようにする。
これで、inputに入力した値がdataオプションで定義するプロパティと同期する。
<!-- v-modelを定義 -->
<input type="text" v-model="newItem">
dataオプションにnewItem
と、入力した値(todoのタスク)を保存する配列todo
を定義する。
var app = new Vue({
el: '#app',
data: {
newItem: '', // 入力フォームと双方向データバインディング
todos: [] // 入力したtodoを保存する配列
},
methods: {
addItem: function(event) {
alert()
}
}
})
さらに、入力フォームで入力した値を配列に保存できるようにaddItem
メソッドを書き換える。
プロパティにはthis.プロパティ名
でアクセスできる。
このthis
はVueインスタンスを指す。
var app = new Vue({
el: '#app',
data: {
newItem: '',
todos: []
},
methods: {
addItem: function(event) {
var todo = {
item: this.newItem // todoオブジェクトに入力した値を保存
}
this.todos.push(todo) // todoを配列に追加
}
}
})
TO DOリストの改善
button
をクリックしてタスクを追加した後に、inputに文字列が残ってしまうため、文字列をクリアにする記述をする。
さらに、空の文字列を保存するのを防ぐための処理を記述する。
methods: {
addItem: function(event) {
// 追加
if (this.newItem === '') return // 空の文字列の場合はここで処理を終える
var todo = {
item: this.newItem
}
this.todos.push(todo)
// 追加
this.newItem = '' // 入力フォームの文字列をクリア
}
TO DOリストの表示
HTML側でリスト表示させる記述をする。
v-for
ディレクィブを使って繰り返し処理をする。
<div id="app">
<h2>TODO List</h2>
<form v-on:submit.prevent>
<input type="text" v-model="newItem">
<button v-on:click="addItem">
追加
</button>
</form>
<!-- 追記 -->
<ul>
<li v-for="todo in todos">
{{ todo.item }}
</li>
</ul>
<!-- 追記 -->
</div>
タスクの完了と未完了の実装
タスクの完了と未完了を管理するチェックボックスを設定する。
addItme
メソッドの変数todo
を編集する。
チェック済みかどうか判定するisDone
を追加し、初期値をfalse
に設定する。
var todo = {
item: this.newItem,
isDone: false // 追加
}
次に、HTMlにチェックボックスを追加し、v-model
ディレクティブにtodo.isDone
を双方向データバインディングさせる。
これで、チェックされるとisDone
がtrue
になる。
<ul>
<li v-for="todo in todos">
<input type="checkbox" v-model="todo.isDone">
<span>{{ todo.item }}</span>
</li>
</ul>
タスクの削除を実装
登録したタスクを個別に削除するため、配列のindex
を取得する。
v-for="(値, index) in 配列"
で配列のindex
が取れる。
続いて削除ボタンを追加し、タスクを削除するメソッドdeleteItem
を定義する。
deleteItem
メソッドの引数には配列のindex
を持たせる。
<ul>
<li v-for="(todo, index) in todos"> <!-- indexの取得 -->
<input type="checkbox" v-model="todo.isDone">
<span>{{ todo.item }}</span>
<!-- 追加 -->
<button v-on:click="deleteItem(index)">Delete</button>
</li>
</ul>
続いてdeleteItem
メソッドを定義する。
配列から要素を削除するJavaScriptのsplice
メソッドを使用して、登録されたタスクを削除する。
methods: {
addItem: function(event) {
// 〜省略〜
},
//追加
deleteItem(index) {
this.todos.splice(index, 1) // sprice(削除を始めるindex, 削除する長さ)
}
}
まとめ
DOMの取得やデータの更新を意識することなく書けるので、コードの見通しがスッキリする。
そして、データバインディング楽しい
更新履歴
Vue.jsの基本的な使い方まとめ
Vue.jsでTO DOアプリを作る 今ココ
Vue.js テンプレート制御ディレクティブ まとめ
Vue.js 算出プロパティとメソッドの違い