Vue.jsでTodoアプリを作ってみよう
Vue.jsというユーザインターフェース構築のためのJavaScriptフレームワークがあります。
非常に人気のあるフレームワークなので、興味のある方もいらっしゃると思います。
そこで、本記事ではVue.jsで簡単なTodoアプリを一から作成する手順を紹介しようと思います。
Vue.jsでのアプリ開発がどのようなものかをざっと理解していただければと思います。
今回作成するTodoアプリは下図のような追加と削除ができるだけの簡単なものです。
Vue.jsでアプリ開発を行う上で知っておいていただきたいことは、アプリを小さい部品(コンポーネント)の集合として考えて開発を行うことができるという点です。
今回のTodoアプリは下図のようにApp、TodoForm、TodoListの3つのコンポーネントで構成されています。
実行環境
Vue.jsにはVue CLIというVue.jsでアプリ開発を行う際にいろいろと支援してくれる便利なツールがありますので、ここでもそのツールを使ってTodoアプリを作ることにします。
下記にVue CLIのサイトのリンクを貼っておきます。
本記事ではVue CLIが既にインストールされている状態から始めることにします。
実行手順
大きな流れは次の通りです。
1.プロジェクトの作成
2.Appコンポーネントの作成
3.TodoFormコンポーネントの作成
4.TodoListコンポーネントの作成
5.実行
1.プロジェクトの作成
「vue create mytodo」を実行します。
Default(Vue 3)を選択します。
mytodoという名前のプロジェクトが自動で作成され、プロジェクトの中には下図のようにフォルダやファイルが存在しています。
Vue CLIを使ってアプリ開発を行う場合は、プロジェクトの中に存在する自動生成されたファイルを変更したり、新しくフォルダやファイルを作成したりしながら開発を進めることになります。
2.Appコンポーネントの作成
既存のApp.vueを下記のように変更します。
App.vue
<template>
<TodoForm v-on:add="addTodo"></TodoForm>
<TodoList v-bind:todos="todos" v-on:delete="deleteTodo"></TodoList>
</template>
<script>
import TodoForm from './components/TodoForm';
import TodoList from './components/TodoList';
let nextId = 0;
export default {
data () {
return {
todos: []
}
},
components: {
TodoForm,
TodoList
},
methods: {
addTodo (newTodo) {
nextId = nextId + 1;
this.todos = [...this.todos, { id: nextId, text: newTodo }];
},
deleteTodo (id) {
this.todos = this.todos.filter(todo => todo.id !== id);
}
}
}
</script>
3.TodoFormコンポーネントの作成
components配下にTodoForm.vueを作成して下記のコードを入力します。
TodoForm.vue
<template>
<h3>My Todo</h3>
<input v-model="newTodo" placeholder="Input here...">
<button v-on:click="addTodo">ADD</button>
</template>
<script>
export default {
data () {
return {
newTodo: ''
}
},
emits: ['add'],
methods: {
addTodo () {
if (this.newTodo === '') return;
this.$emit('add', this.newTodo);
this.newTodo = '';
}
}
}
</script>
4.TodoListコンポーネントの作成
components配下にTodoList.vueを作成して下記のコードを入力します。
TodoList.vue
<template>
<h5>Todo List</h5>
<ul>
<li v-for="todo in todos" v-bind:key="todo.id">
{{ todo.text }}
<button v-on:click="deleteTodo(todo.id)">DEL</button>
</li>
</ul>
</template>
<script>
export default {
props: ['todos'],
emits: ['delete'],
methods: {
deleteTodo (id) {
this.$emit('delete', id);
}
}
}
</script>
5.実行
「npm run serve」を実行します。
ブラウザで「http://localhost:8080」を開くとアプリが起動します。
学習教材の紹介
上記では簡単なTodoアプリを一から作成する手順を紹介しましたが、Vue.jsでのアプリ開発のイメージを掴んでいただけたのではないでしょうか。
Vue.jsに興味を持たれてVue.jsの学習を始めてみようと思われた方もいらっしゃると思いますので、Vue.jsの学習教材について少し紹介しようと思います。
公式ドキュメント
Vue.jsに関して一番正確な情報源です。
下記にリンクを貼っておきます。
Qiitaの記事
例えば「vue.js 入門 qiita」という検索ワードで検索すると下図の様にいろいろと記事が見つかりますので、それらの記事を読んで学ぶのも良いと思います。
Taniaさんの記事
Web開発関連の記事を多く執筆されているTaniaさんが作成されたVue Tutorialは非常に有益だと思います。
以前下記の記事で紹介しましたので、興味のある方はご確認ください。
ネット上には非常に多くの学習教材がありますので、いろいろと検索して探してみるのも面白いと思います。
Vue.jsとTodoMVC
上記では追加と削除しかできない簡単なTodoアプリを作成しましたが、もっといろいろなことができるTodoMVCというものがあります。
todomvc-app-cssを使って作られた下図のような外見のアプリです。
todomvc-app-cssについては以前下記の記事で紹介しましたので、興味のある方はご確認ください。
実は、Vue.jsで作られたTodoMVCがあり、そのコードを見ることができます。
TodoMVCのコードが見れるのは次の2箇所です。
Vue.jsのドキュメント(v2)の中
Vuex(Vue.jsの状態管理ライブラリ)のGitHubリポジトリの中
Vue.jsのドキュメント(v2)の中
ドキュメントの中にTodoMVCが埋め込まれています。(動かすこともできます)
スライダーを右にずらすとコードが現れます。
下記にリンクを貼っておきます。
Vuex(Vue.jsの状態管理ライブラリ)のGitHubリポジトリの中
VuexのGitHubリポジトリにはexamplesというフォルダがあります。
examplesの中にTodoMVCが含まれています。
examplesを実行してTodoMVCを選択します。
TodoMVCを動かすことができます。
下記にリンクを貼っておきます。
TodoMVCのコード量はそれほど多くないので、Vue.jsを学習する際にはTodoMVCのコードを見ながらVue.jsの文法を理解していくのも良いと思います。
CypressとTodoMVC
CypressというWebアプリケーションの自動テストツールがあります。
Cypressについては以前下記の記事で紹介しました。
実はCypressとTodoMVCは深い関係があります。
Cypressのテスト対象としてTodoMVCがよく使われており、Cypressの公式サイトや公式のGitHubリポジトリを探してみると、TodoMVCをテストしているコードがいろいろと見つかります。
例えばCypressの公式ドキュメントのExamplesの中にTodoMVCがあります。
CypressでTodoMVCをテストしている実行画面です。
下記にリンクを貼っておきます。
他にも「testing-workshop-cypress」というCypressを学習するのに非常に有益なGitHubリポジトリもあります。
下記は初級者向けのコンテンツの一覧です。
下記は中上級者向けのコンテンツの一覧です。
上記のワークショップでは下図のようにバックエンドと通信を行うTodoMVCをCypressを使ってテストを行う方法を学ぶことができます。
Cypressには下記のような本格的なアプリを使った学習教材もありますが、TodoMVCよりかなり規模の大きいアプリを使った内容になっていますので、学習の難易度は高めです。
よって、これからCypressを学ぼうと思われている方はTodoMVCをテストしているコードから学習を始めて、Cypressに慣れてきたら下記の学習教材をチェックされるのが良いと思います。
下記にリンクを貼っておきます。