ご覧いただきありがとうございます!UGと申します!
前回の「 おじさんと一緒にToDoアプリチュートリアル(2)」の続きです。
前回やっと「動くぞ!」を体感していただけたかと思います。
今回は、「まだ動く!?」を体験していただければと思います!!!
前回は動的に文字を動かしました。
今回は、実際にtodoリストを追加して!さらなる「動くぞ!!」を体感していただきたいです。
※ html・css・JavaScriptが何となく書ける方向けです
※今回、vue-cliは使用しません。基本的なVueの機能を体感したい、という人向けです。
目次
1.本記事でのゴール!と実装する上での考え方
最終的なゴール

最終的なゴールは上記gif画像の通りです。前回と同様です。
1.Vueを使って文字を表示する
2.inputタグに入力した文字をブラウザ上に反映させる
3.todoリストを表示させる
4.todoリストに表示させる部品を作成する
5.inputタグに入力した文字をtodoリストへ反映させる
6.削除ボタンを押す事でtodoリストからアイテムを削除させる
これらの動作を実装していきたいと思います!
本記事でのゴール!
本記事でのゴールは上記3
「 todoリストを表示させる 」
※前回用意したinputタグに入力し、その値がtodoリストとして表示される、と捕らえてください。
を目標にしていきたいと思います!
実装する上での考え方
1.data型にオブジェクトとしてtodoリストを用意、配列として格納。
2.ul・liタグを用意して、todoリストをhtmlとして表示させる
3.前回記事で実装したmodelから、todoリスト配列へ入れ込む
4.入力する上でのバリデーションを設ける
2.今回のファイル構成
test
│ index.html
│
└─js
index.js
前回と同様のファイル構成です。
説明は割愛させていただきます。
ファイルの中身を見たい、という方は、前回の記事を参照してください。
3.v-forを用いて、todoリストを表示させる!
index.jsにToDoリストの配列を用意
new Vue({
el: "#app",
data: () => ({
message: "sample",
list: [
{ id: 1, text: "todoリスト1" },
{ id: 2, text: "todoリスト2" },
],
}),
});
前回記事最終コードに「list」というデータ型を追加しました!(5・6・7行目)
「何番目のリストか」を表す「 id 」、「 todoの内容 」としての「 text 」 を配列としてlistへ格納しました。
あとはこれを、htmlとして出力します。
出力する際は、foreachのような役割を果たす、「v-for」を用います。
index.htmlにul/liタグを用意し、liタグにv-forを記載する
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>hello!!!</h1>
<div id="app">
<div id="message">
<input type="text" v-model="message" />
<p>{{ message }}</p>
</div>
<!-- ul liタグを用意する -->
<div class="todo">
<ul class="todo-content">
<li
class="todo-content-item"
v-for="item in list"
v-bind:key="item.id"
>
{{ item.id }}:{{ item.text }}
</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./js/index.js"></script>
</body>
</html>
前回最終コードに、先ほど準備した配列を吐き出す為のul liタグを加えました!(17~27行目)
~解説~
・v-for
foreachのようなモノです。JSのforの記載方法と同じように記載します。
listという配列をitemとして返す!といった具合です。
itemとして返されているものには、indexjsで記載したidとtextの情報が含まれています。
これを{{ item.id }}、{{ item.text }}としてhtmlとして表示させます
※{{ }}この記載ってなんぞ?という方は、前々回の記事をご覧ください
・v-bind:key
Vueが v-forをする際に 「配列の中の何番目を表示しているのか把握する」為の目印の役割となります。
v-bind:keyを与えなくても表示されますが、公式マニュアルでも推奨しており、 v-bind:key を与えないことで、「 表示は消えるけど要素は残る 」等、思わぬ挙動をするときもあります。
マニュアルに則り、v-bind:keyを表示するようにしましょう
4.ボタンを配置、v-onでtodoリストに加える
index.htmlにボタンを用意して、 v-on:click=”addTodoList” を加えてあげる
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>hello!!!</h1>
<div id="app">
<div id="message">
<input type="text" v-model="message" />
<button
v-on:click="addTodoList"
>
todoリストに加える
</button>
<p>{{ message }}</p>
</div>
<!-- ul liタグを用意する -->
<div class="todo">
<ul class="todo-content">
<li
class="todo-content-item"
v-for="item in list"
v-bind:key="item.id"
>
{{ item.id }}:{{ item.text }}
</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./js/index.js"></script>
</body>
</html>
考え方工程3.前回記事で実装したmodelから、todoリスト配列へ入れ込む
に入っていきます。htmlにボタンを用意して、
v-on:click=”addTodoList”
を配置してあげます
※v-onってなんぞ?の方は前回の記事を見てみてください!
index.jsで addTodoList を定義してあげる
new Vue({
el: "#app",
data: () => ({
message: "sample",
list: [
{ id: 1, text: "todoリスト1" },
{ id: 2, text: "todoリスト2" },
],
}),
methods: {
addTodoList() {
// 現在の配列の個数から、次のid番号を取得する
const nextId = this.list.length + 1;
// v-modelで入力されたmessageを新たなtodotextとする
const todoText = this.message;
// listと同様のオブジェクトにする
const newTodo = {id:nextId, text: todoText};
// 配列に加える
this.list.push(newTodo);
// 配列に加えた後、inputの中身を空にする
this.message = '';
}
},
});
10行目以降に、addTodoListメソッドを定義させました。
以下の流れとなります。
1.追加するIDを取得するために、配列の個数を数え(length) 、それに1を加えたモノを新たに追加するためのIDとして設置
2.todoリストの内容は、modelで設定している「message」とするため、this.messageとする
3.新たなIDとtextをlistと同じオブジェクトにして、
4.push()で配列の一番後ろに入れる!
5.push()した後は、inputタグの中に文字が残らないように、messageを空にする
という流れをmethodとして定義させました!
5.こいつ・・・動くぞ!
ここまでお付き合い頂いた方は、
動く!!
動くぞ!!!
となっているかと思います!!!
今のままでも基本的な動作は出来ていますが、空白のToDoリストでも入力可能な状態となっており、少しかっちょ悪いので、
「空文字だと入力出来ない」
というバリデーションを加えましょう!!!
6.computedを用意して、ボタンdisabledを操作
<button
v-on:click="addTodoList"
v-bind:disabled="isDisabled"
>
todoリストに加える
</button>
methods: {
addTodoList() {
// 現在の配列の個数から、次のid番号を取得する
const nextId = this.list.length + 1;
// v-modelで入力されたmessageを新たなtodotextとする
const todoText = this.message;
// listと同様のオブジェクトにする
const newTodo = {id:nextId, text: todoText};
// 配列に加える
this.list.push(newTodo);
this.message = '';
}
},
computed: {
isDisabled() {
if(this.message.length <= 0) {
return true;
} else {
return false;
}
}
},
index.jsとindex.htmlにて、バリデーションに関する部分だけ抜粋して、追加のコードを記載しております。
・ v-bind:disabled=”isDisabled”
disabledをv-bindしております。isDisabledをjs側で
「message」が「文字数0の時」と「文字数が1以上の時」
と条件を付けてあげて、true,falseを返してあげます。
・computed
算出プロパティと呼ばれるモノです。
既存のプロパティを算出した結果を取得するモノです
※ここでは、messageを算出して、結果を返す、という行為に当たります。
・if()以下
this.messageにてmessageを取得し、lengthにて文字数へ返還、0以下であればdisabledをtrue、それ以外であればfalseを返しています。
ここまで記載していただければ、文字数によってボタンが押せたり、押せなかったりの挙動が確認できるはずです!!
まとめ
本記事での最終的なコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>hello!!!</h1>
<div id="app">
<div id="message">
<input type="text" v-model="message" />
<button
v-on:click="addTodoList"
v-bind:disabled="isDisabled"
>
todoリストに加える
</button>
<p>{{ message }}</p>
</div>
<!-- ul liタグを用意する -->
<div class="todo">
<ul class="todo-content">
<li
class="todo-content-item"
v-for="item in list"
v-bind:key="item.id"
>
{{ item.id }}:{{ item.text }}
</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./js/index.js"></script>
</body>
</html>
new Vue({
el: "#app",
data: () => ({
message: "sample",
list: [
{ id: 1, text: "todoリスト1" },
{ id: 2, text: "todoリスト2" },
],
}),
methods: {
addTodoList() {
// 現在の配列の個数から、次のid番号を取得する
const nextId = this.list.length + 1;
// v-modelで入力されたmessageを新たなtodotextとする
const todoText = this.message;
// listと同様のオブジェクトにする
const newTodo = {id:nextId, text: todoText};
// 配列に加える
this.list.push(newTodo);
this.message = '';
}
},
computed: {
isDisabled() {
if(this.message.length <= 0) {
return true;
} else {
return false;
}
}
},
});
いかがだったでしょうか
本記事にて
・v-forの使い方
・ computedの使い方
を紹介いたしました!
次回は、今回配列を表示させるために用いたul・liタグの部分を部品化して別ファイルに記載し、取り出していきたいと思います!
それでは、今回はここで失礼いたします!