はじめに
作成するアプリについて
本記事ではVue CLIを使って、簡単なTODOアプリを作成していきます。
機能としては以下の通りです。
- TODO一覧の表示
- TODO追加
- TODO削除
対象読者
- progateのhtml, javascriptコースを完了した方
- Vue.jsを勉強し始めた方
参考文献
Vue.jsでTodoアプリを作ってみよう
kenpapa (著)
前提条件
以下がインストール済みであることを前提とします。
- Visual Studio Code
- node.js
- npm
目次
-
Vue CLIのインストール
-
プロジェクト作成
-
サンプルアプリの起動
-
TODO追加機能実装
- 入力フォームの作成
- TODOを格納する配列を定義
- クリックイベントの実装
- 追加処理の実装
- TODOを一覧表示
- チェック処理の実装
-
TODO削除機能実装
- クリックイベントの実装
- 削除処理の実装
Vue CLIのインストール
Vue CLIとは、Vue.jsアプリケーションの雛形を簡単に作成できるツールです。
コマンドベースでサンプルアプリを作成できます。
では、Vue CLIをインストールしていきましょう。
Macであればターミナル、Windowsであればコマンドプロンプトを起動し、以下のコマンドを実行してください。
npm install -g @vue/cli
プロジェクトの作成
Vue CLIのインストールが完了したら、プロジェクトを作成するディレクトリに移動してください。
今回はデスクトップ直下に"todo-app"というプロジェクト名で作成します。
ターミナルで以下コマンドを実行してください。
Desktop $ vue create todo-app
少し待つとプリセットの選択を求められます。
今回は追加で機能を設定できるManually select featuresを選択します。
Desktop $ vue create todo-app
Vue CLI v4.4.4
? Please pick a preset:
default (babel, eslint)
❯ Manually select features
デフォルトでBabelとLinter / Formatterにチェックが付いているかと思いますが、追加でRouterを選択します。
選択するにはカーソルを合わせてspaceキーを押下してください(Macの場合)
チェックがついたらEnterを押下してください。
? Please pick a preset: Manually select features
? Check the features needed for your project:
◉ Babel
◯ TypeScript
◯ Progressive Web App (PWA) Support
❯◉ Router
◯ Vuex
◯ CSS Pre-processors
◉ Linter / Formatter
◯ Unit Testing
◯ E2E Testing
以降もいくつか選択を求められますが、全てデフォルトで大丈夫です。
全て選択するとプロジェクトの作成が始まります。
サンプルアプリの起動
それでは動作確認のためアプリを起動してみましょう。
cdコマンドでプロジェクトルートディレクトリに移動します。
Desktop $ cd todo-app
todo-app $
起動コマンドを叩きます。
todo-app $ npm run serve
では、実際にアクセスしてみましょう。
任意のブラウザでhttp://localhost:8080/にアクセスしてください。
以下の画面が表示されるかと思います。
これで動作確認は完了です。
アプリの起動を停止しましょう。
ctrl + cで停止させてください。
TODOアプリの確認
では、TODOアプリを作成していきましょう。
作成したプロジェクトをVisual Studio Codeで開いてください。
App.vueを以下のように修正して、保存してください。
<template>
<div>
<h3>My TODO</h3>
<input v-model="newTodo" placeholder="Input here...">
<button v-on:click="addTodo()">ADD</button>
<h5>ToDo List</h5>
<ul>
<li v-for="(todo, i) in todos" v-bind:key="i">
{{ todo }}
<button v-on:click="deleteTodo(i)">DEL</button>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
todos: [],
newTodo: ""
}
},
methods: {
addTodo() {
if (this.newTodo === "") return;
this.todos.push(this.newTodo);
this.newTodo = "";
},
deleteTodo(i) {
this.todos.splice(i, 1);
}
}
}
</script>
再度アプリを起動してみましょう。
また、Visual Studio Code内でターミナルを起動することも可能です。
上部メニューのターミナル>新しいターミナルから起動してください。
起動後、再度"http://localhost:8080/"にアクセスしてください。
以下のような画面になっているかと思います。
入力フォームに適当な値を入力して、ADDボタンを押してみてください。
こちらが今回作成するアプリになります。
ここではアプリのイメージを掴むため、コピペしていただきましたが、以降では順を追って実装内容を説明していきます。
初学者の方は、App.vueの記載を全て削除して、一から自身でコーディングしてみることをおすすめします。
TODO追加機能の実装
では、実装内容を見ていきましょう。
一からコーディングされる方向けに説明していきます。
まず、App.vueの記載を全て削除し、以下のようにベース部分をコーディングしましょう。
機能は何もありませんが、起動すると静的な画面が表示されます。
<template>
<div>
<h3>My TODO</h3>
<input placeholder="Input here...">
<button >ADD</button>
<h5>ToDo List</h5>
<ul>
<li>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
}
}
</script>
入力フォームの作成
TODOを追加するには、input要素に入力された値をjavascript側で操作できるようにする必要があります。
Vue.jsではその紐付けのことをバインディングと呼んでいます。
input要素に入力された値をバインディングするには、v-modelディレクティブを使用します。
v-modelディレクティブについては、こちらを参照してください
ここでは変数名をnewtodoとしています。
<input v-model="newTodo" placeholder="Input here...">
合わせてscript部分のdataに変数newtodoを定義します。
return{}のなかに記載してください。
これで"newtodo"という変数のバインディングを定義したことになります。
data() {
return {
newTodo: ""
}
}
上記のように記載すると、input要素に入力された値をjavascript側で、"newTodo"という変数名で扱えるようになります。
TODOを格納する配列を定義
次にTODOの格納先を作成します。
今回は簡易的に配列に格納することにします。
Script部分のdata()にtodosという変数名で、空の配列を定義してください。
カンマ","を忘れないよう注意してください。
data() {
return {
todos: [],
newTodo: ""
}
}
todosという変数とnewTodoという変数を定義したことになります。
クリックイベントの実装
TODOの追加方法ですが、ADDボタンが押されたら、配列に追加する仕様としましょう。
※このような仕様を説明する際は、ボタンのクリックイベントをトリガーにTODOの追加処理を行う、などと言います。
Vueでクリックイベントの実装には、v-onディレクティブを使用します。
ここではクリック時にaddTodo()メソッドを実行するよう定義しています。
<button v-on:click="addTodo()">ADD</button>
追加処理の実装
続いて、追加処理となるaddTodo()メソッドを定義します。
Vue.jsではmethods部分にメソッドを定義していきます。
methods: {
addTodo() {
this.todos.push(this.newTodo);
this.newTodo = "";
}
}
まず、配列に追加する値を取得します。
data部分に定義された変数を呼び出すにはthisを使います。
this.newTodo でフォームに入力された値を取得することができます。
また、格納先の配列もthisを使って記載します。
追加処理は引数の値を配列に格納するpushメソッドを使用します。
以下のような実装をすることで、追加処理を行なっています。
this.配列の変数名.push(this.追加対象の変数名)
また、追加処理後に変数newTodoの値を空に設定します。
入力フォームの値をクリアしています。
this.newTodo = "";
※上記で説明したバインディングは、正確には双方向バインディングという機能です。
詳細はこちらを参照してください
TODOの一覧表示
追加したTODOを一覧表示する機能を実装していきます。
方針としては配列に格納された値を取得し、繰り返し処理を実施して、各項目を表示していきます。
Vue.jsで繰り返し処理を行うには、v-forディレクティブを使用します。
templateのli要素の部分を修正してください。
<li v-for="(todo, i) in todos" v-bind:key="i">
{{ todo }}
</li>
v-for="(todo, i) in todos"
と書くことで、配列todosから要素を1つ1つ取得し、todoという変数に格納しています。
{{ todo }}
で変数todoに格納された値を表示しています。
v-bind:key="i"
ではindex番号を格納する変数を定義しています。こちらは削除処理の際に、対象要素を指定するのに使用します。
チェック処理の実装
ここまででTODOの追加処理を実装することができました。
しかし、入力フォームが空のままADDボタンを押して見てください。
TODO名が空の項目が追加されていると思います。
これは本来の用途に沿わないため、仕様として不適切です。
これを回避するためチェック処理を実装します。
pushメソッドを実行する前に、以下のif文を追加してください。
methods: {
addTodo() {
if (this.newTodo === "") return;
this.todos.push(this.newTodo);
this.newTodo = "";
}
}
this.newTodoの値が空の場合、addTodoメソッドを抜ける(returnする)処理を実装しています。
TODO削除機能の実装説明
クリックイベントの実装
追加と同様にv-onディレクティブを使用して、DELボタン押下をトリガーに、TODOを削除する仕様とします。
メソッド名deleteTodo(i)メソッド
引数のi
はindex番号が格納されています。
<li v-for="(todo, i) in todos" v-bind:key="i">
{{ todo }}
<button v-on:click="deleteTodo(i)">DEL</button>
</li>
削除処理の実装
methodsにdeleteTodoメソッドを実装します。
配列から要素を削除するには、spliceメソッドを使用します。
spliceメソッドは第一引数で開始位置を指定し、第二引数で削除する要素の個数を指定します。
spliceメソッドの説明
開始位置はインデックス番号と同じですので、第一引数にはi
を指定し、削除個数は1要素だけですので、第二引数には1
を指定します。
methods: {
addTodo() {
if (this.newTodo === "") return;
this.todos.push(this.newTodo);
this.newTodo = "";
},
deleteTodo(i) {
this.todos.splice(i, 1);
}
}
これで一通りのTODO追加、削除機能が実装できました。
終わりに
お疲れ様でした。
次回はデータベースやAPIサーバを利用した実装を紹介したいと思います。