Vue.js始めるおれおれアドベントカレンダー2016 – 2日目
すぐ触れるやつ
試したい場合はこちらでどうぞ。
コンストラクター
new Vue({ el: selector }) で生成。
<div id="app"> <h1>My First App</h1> </div>
var vm = new Vue({
el: '#app',
});
el: $('body').children().first().get(0) みたいに、セレクターの代わりにDOMオブジェクトでもいける。(jQueryオブジェクトではない。)
data でデータ
<div id="app">
<h1>{{message1 + message2}}</h1>
</div>
var vm = new Vue({
el: '#app',
data: {
message1: 'Hello ',
message2: 'World!',
},
});
computed で動的情報
「算出プロパティ」(Computed Properties) と呼ぶみたい。
<div id="app">
<h1>Welcome {{fullName}}!</h1>
</div>
var vm = new Vue({
el: '#app',
data: {
firstName: 'Ginpei',
lastName: 'Takanashi',
},
computed: {
fullName: function() {
return this.firstName + ' ' + this.lastName;
},
},
});
めっちゃ便利っぽい。
しかも計算結果はキャッシュされ、使用情報(今回なら firstName と lastName )が更新された場合だけ再実行されるとか。すごい。
methods でメソッド
単数形 method ではない。(百万回くらい間違えた。)
<div id="app"> <button v-on:click="hello_click">Hello</button> </div>
var vm = new Vue({
el: '#app',
methods: {
hello_click: function(event) {
alert('Hello!');
},
},
});
あー言ってるそばから method と書いてしまった……。(修正した。)
computed があるので、単純な画面出力に使う場面は少なさそう?
components でコンポーネント
v-bind で情報を与えて、 props で名前を指定して受け取る。
<div id="app"> <app-title v-bind:title="'Sugoi Yo!'"></app-title> </div>
// <app-title>
var appTitle = {
template: '<h1>{{title}}</h1>',
props: [ 'title' ],
};
// Main
var vm = new Vue({
el: '#app',
components: {
appTitle: appTitle,
},
});
情報は v-bind:foo で与え、 props で受け取る。一度受け取った情報はコンポーネント側に所属?するようになり、変更は親へ通知されないみたい。今回やってないけどイベントハンドラーも v-bind で渡す。
奥が深そうなので別にします。また今度詳しく見る。
ちなみにES2015 (ES6) で追加された文法だと、 { appTitle: appTitle } の代わりに短く { appTitle } と書ける。
watach で値を監視
あんまり使わなさそ。いやでも外部ライブラリと連携したりするときにもりもり使うか。
<div id="app">
<label>
Search:
<input v-model="keyword" type="search" />
</label>
</div>
var vm = new Vue({
el: '#app',
data: {
keyword: '',
},
watch: {
keyword: function(keyword) {
var url = '/search?keyword=' + this.keyword;
axios.get(url)
.then(function(response) {
// ...
})
},
},
});
とはいえ変更の瞬間に通信開始してもアレだな。 throttling が必要?
テンプレートで出力
文字列を表示する
コンストラクターの data に除法を格納、テンプレートの {{key}} で出力。HTMLエスケープされる。
<div id="app">
<p>{{message}}</p>
</div>
var vm = new Vue({
el: '#app',
data: {
message: '<b>BOLD</b>',
},
});
data 以外の方法でも同様。JavaScriptコードを書けるので、 {{message.trim()}} とかしても良い。でもたぶん computed に入れちゃった方が良いよね。
HTMLを出力する
v-html で指定すると、HTMLをそのまま出力する。
<div id="app"> <p v-html="message"></p> </div>
var vm = new Vue({
el: '#app',
data: {
message: '<b>BOLD</b>',
},
});
Vue使ってるとあんまりそういうことなさそう。外部サービスのやつを埋め込むときとか?
テンプレートの制御
v-show で表示切替
<div id="app"> <label><input v-model="visible" type="checkbox" /> Visible</label> <p v-show="visible">Hello!</p> </div>
var vm = new Vue({
el: '#app',
data: {
visible: false,
},
});
v-hide はないみたい。
v-if で表示切替
あと v-else-if (v2.1+)と v-else も。
<div id="app">
<select v-model="language">
<option value="en">English</option>
<option value="ja">Japanese</option>
<option value="ja_KS">Kansaian</option>
</select>
<div v-if="language==='en'">
<h1>Hello!</h1>
</div>
<div v-else-if="language==='ja'">
<h1>こんにちは!</h1>
</div>
<div v-else>
<h1>☺</h1>
</div>
</div>
var vm = new Vue({
el: '#app',
data: {
language: 'en',
},
});
v-else-if はあんまり使わない方が良いんじゃいかなあ。
v-for で繰り返し出力
<div id="app">
<ul>
<li v-for="name in names">{{name}}</li>
<li v-for="i in 3">{{i}}</li>
</ul>
</div>
var vm = new Vue({
el: '#app',
data: {
names: [
'Alice',
'Bob',
'Charlie',
],
},
});
v-for="value in object" とか v-for="(value, key) in object" とか も使えるらしい。デバッグ時に便利かも。
あと v-for="i in 999" と数字を指定して繰り返せるのも、デザイン考えるときにダミー出力するのに使えそう。
インタラクション
v-on でイベント監視
<div id="app">
<form v-on:submit.prevent="form_submit">
<input type="search" />
<button>Search</button>
</form>
</div>
var vm = new Vue({
el: '#app',
methods: {
form_submit: function(event) {
// preventDefault不要!
},
},
});
.prevent を付けると自動で event.preventDefault() を呼び出しておいてくれる。おお、これべんり。
v-model でフォーム入力値
<div id="app">
<p>{{message}}, {{available}}, {{number}}</p>
<p><input v-model="message" type="text" /></p>
<p><input v-model="available" type="checkbox" /></p>
<p><input v-model.number="number" type="number" /></p>
</div>
var vm = new Vue({
el: '#app',
data: {
available: true,
message: 'abc',
number: 100,
},
});
いわゆる双方向バインディングってやつかしら。フォーム側で変更すると即座に反映される。
.number を付けると数値に変換して操作してくれる。これ便利! これでもう '1' + '2' が '12' になってしまうようなアレに悩まされることもなくなるのでは。
あとフォームの種類は豊富だけど、チェックボックスなら真偽値に、みたいな感じでなんかうまいことやってくれるっぽい。
そんな感じ。
そんなにたくさん覚えなくちゃいけない感じではないけど、 v-on.submit.prevent みたいな便利なやつがちょくちょく 追加されて良い感じの感じでした。