参考
Vue Mastery
The Net Ninja Vue JS 2 Tutorial
Vue.js とは
Vue.jsとはユーザーインターフェースを構築するための**フレームワーク
(アプリケーションの基本的な機能やルールを提供する骨組み)で、主にSPA(シングルページアプリケーション)
**を構築する時に向いています。「学習コストの低さ」「スケールの柔軟性」「公式ドキュメントの充実」が魅力
**SPA(シングルページアプリケーション)
**とは
JavaScriptでDOMを操作しページを切り替える単一ページで構成されるWebアプリケーション
DOM / 仮装DOM
とは
DOM
: Document Object Modelの略で、JavaScriptからHTMLやCSSのデータを取得、操作するための仕組み。htmlドキュメントをツリー構造として表現したもの。
<html>
<head>
<title>Vue.js</title>
</head>
<body>
<h1>DOMとは</h1>
</body>
</html>
上記のマークアップは下記のような「DOMツリー」として表現されます。
html
├── head
│ └──title
│ └──Vue.js-lesson2
└── body
└── h1
├──DOMとは
└──h1タグのコメント
仮装DOM
: 仮想DOMはバインディングしたデータを元に作られ、仮想DOMを元にDOMを作成する。
仮想DOMを利用する目的の1つとして、描画処理の性能を向上させる狙いがあり、実際のDOMでの描画処理では、仮想DOMの差分検出アルゴリズムで描画処理前の仮想Nodeツリーから更新対象を抽出する。
描画対象となるDOMに対して、Nodeの新規追加・更新・削除といったDOM操作を行う。
Vueアプリケーションの作成
アプリケーション作成のために、コンストラクタ関数vue
を使ってルートとなるvueインスタンス
を作成する。vue インスタンス
はアプリケーションの心臓部分。
var app = new Vue ({
// オプション
})
※ 慣例的にappやvmなどの変数名が使用される。
オプションの構成
var app = new Vue ({
el: '#app',
data: {
message: 'Vue.js'
},
computed: {
},
method: {
},
created: function(){
}
})
<div id='app'></div> //ここが対象要素となる
-
elオプション
: マウントするDOM要素(アプリケーションを紐付ける要素のセレクタ) -
data
: アプリケーションで使用するデータです。オブジェクトや配列も登録できる。ここで定義されるプロパティは**リアクティブなプロパティ
**へと変換される。
var app = new Vue ({
el: '#app',
data: {
message: 'Vue.js' //変化を検知できるようになる
}
})
####リアクティブなプロパティ / データ
とは?
DOMの同期を自動で行う「データバインディング」を行うには、
テンプレートで使用するデータは「リアクティブなデータ」として定義する必要がある。
リアクティブなデータ
とはVue.jsによって取得した時(get)、または代入した時(set)のフック処理が登録された"反応のできるデータ"のこと。
####データバインディング
データと描画を同期させる仕組みのことを「データバイディング」と呼ぶ。
HTMLで作られたUIを操作するのに、viewの管理(DOMの更新など) は必要不可欠。
ライブラリを一切利用せずにJavaScriptでDOMを更新した時は、
var el = document.getElementById('text') //要素を探す
el.innerText = '新しいテキスト' //要素を更新する
上記の処理で、UIのパターンごとにDOMを更新するのは、
UIのパターンが増えれば、増えるほど大変になっていってしまう・・
のでこういう自動的に描画が同期できるシステムはとても便利。
computed
: 算出プロパティ
算出プロパティは処理に名前をつけて、テンプレート上で変数の様に使うことができる関数。
【 特徴 】
- 一度計算を行った場合、再度関数を呼び出しても依存しているデータに変更がない限りキャッシュを返す(変更箇所だけが返される)
- プロパティ呼び出しの時は
()
が不必要 - リアクティブなプロパティが変更された時に呼ばれるのが
computedプロパティ
methods
: メソッド
オブジェクトの操作を処理を定義したもの
【 特徴 】
・ 計算結果をキャッシュしない
・ そのため再描画されるたびにもう一度、計算が実行される
・ イベントに反応する
created
Vue.jsのライフサイクル
ライフサイクルとは、Vueインスタンス
のはじまり(初期化)からおわり(破棄)されるまでの一定のサイクルのこと。あらかじめ登録された処理を、Vueインスタンスの特定のタイミングで差し込みます。
こうした処理を割り込ませる仕組みを「フック」と呼ぶ。
コンポーネントのライフサイクルフックがどの時点で実行されるかは以下になります。
ライフサイクルダイアグラム
メソッド | 説明 |
---|---|
beforeCreated | インスタンスが作成され、初期化される前に実行 |
created | インスタンスが作成され、初期化された後に実行 |
beforeMount | DOMがマウントされる直前に実行 |
mounted | DOMがマウントされる直後に実行 |
beforeUpdate | リアクティブプロパティが変更されて、変更されたデータがDOMに反映される前に実行 |
updated | リアクティブプロパティが変更されて、変更されたデータがDOMに反映された後に実行 |
beforeDestroy | Vueインスタントが破棄される前に実行 |
destroyed | Vueインスタンスが破棄された後に呼び出される |
created
: リアクティブなプロパティの初期化が完了しているので、dataやmethodsを参照することができる。APIにリクエストを送信してデータを送信し、リアクティブプロパティに追加していく処理はcreated内に記述していくと良い。
Vue.jsの基本機能
テキストと属性のデータバインディング
Mustache構文 {{}}
var app = new Vue ({
el: '#app',
data: {
message: 'Vue.js',
list: ['ねこ', 'いぬ', 'とり']
},
computed: {
},
method: {
},
created: function(){
}
})
dataオプション
に定義したmessage
プロパティの値を画面に表示したいときは、
{{}}
マスターシュ構文(Mustache:口髭) で囲みテンプレートに記述します。
<h1>{{message}}</h1> // Vue.js と表示される
<h1>{{list[0]}}</h1> // ねこ と表示される
ディレクティブ
「Vue.js」では、ディレクティブと呼ばれる**v-接頭辞
で始まる属性をHTML内で使用できます。
ディレクティブは主にデータバインディング**を行うために使用される。
v-bind ディレクティブ
簡単なテキストのデータバインディングであればMustache構文を使えましたが、html要素の属性をデータバインディングする場合にはMustache構文はエラーとなり使えません。
<div id="error">
<a href="{{ url }}">Google</a> // 属性では展開されない!
</div>
var app = new Vue({
el: "#example-error",
data: {
url: "https://google.com"
}
});
そこで使用するのが v-bindディレクティブ
です。
v-bindディレクティブ を使えばDOM要素の属性を動的に切り替えることができます。
<タグ v-bind:属性=“プロパティ”>~</タグ>
<div id="example">
<a v-bind:href="url">Google</a>
</div>
var app = new Vue({
el: "#example",
data: {
url: "https://google.com"
}
});
####**v-bind ディレクティブ
**の省略
v-bind は省略して、**:
**のみで省略できます。
<div id="example">
<a :href="url">Google</a>
</div>
v-on ディレクティブ
v-onメソッド
はイベント処理をするためのディレクティブです。
(例) clickイベントを設定する
<div id="app">
<p>{{ count }}回クリック</p>
<button v-on:click="increment">このボタンでカウントを増やす</button> //increment メソッドが呼び出される
</div>
var app = new Vue ({
el: '#app',
data: {
count: 0
},
method: {
increment: function(){
this.count += 1 // thisはdata内のリアクティブデータを指す
}
},
})
v-on
ディレクティブの省略記法について
v-on は省略して、**@
**で省略できます。
<div id="app">
<p>{{ count }}回クリック</p>
<button @click="increment">このボタンでカウントを増やす</button> //increment メソッドが呼び出される
</div>
v-show ディレクティブ
v-showディレクティブは、式が真のときのみ要素を表示するディレクティブです。
<div id="app">
<div v-show="ok">
<p>Hello</p>
</div>
</div>
var app = new Vue({
el: '#app',
data: {
ok: true // 切り替える
}
})
v-if
とv-show
の違いと使い分け
v-if
:条件を満たさなかった場合、要素はDOmレベルで削除される。
v-show
:条件を満たさなかった場合、display;none
が付与され、非表示になる。
条件分岐
vue.jsはテンプレートベースで条件分岐を記述します。
v-ifディレクティブ
は、v-showディレクティブ
同様に式の真偽を判定して要素を表示させるディレクティブ
<p v-if="id === 1"> 条件がtrueの時の表示 </p>
<p v-else-if="id === 2"> 上記がfalseで、else-ifでの条件がTrueの表示 </p> //今回はこのpタグが表示される
<p v-else> 上記のどちらの条件もfalseの時の表示 </p>
var app = new Vue ({
el: '#app',
data: {
message: 'Vue.js',
id: 2, // ← ここ
},
})