▶ 技術めも
Vue.js v1.0
http://dotinstall.com/lessons/basic_vuejs
公式サイト
http://vuejs.org
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>My Vue.js Practice</title>
</head>
<body>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
</body>
</html>
object(ViewModel) - data/methods(Model) <--> interface(View)
Model View ViewModel - MVVM
ディレクトティブ v-text
<div id="mycounter">
<div v-text="count"></div>
<div v-text="count * 10"></div> // 計算
<div v-text="'(' + count + ')'"></div> // フォーマット
<div v-text="count ? count : '-'"></div> // 三項演算子
<button v-on="click: count++">Up</button> // 式が使える
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
<script>
// counter
var vm = new Vue({
el: '#mycounter',
data: {
count: 0
}
});
</script>
mustache マスタッシュ記法
{{ content }} v-text
{{{ content }}} v-html
<div id="myapp">
<!-- <div v-text="content"></div> -->
<!-- <div>{{'content: ' + content}}</div> -->
<!-- <div v-html="content"></div> -->
<div>{{{content}}}</div>
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
<script>
var vm = new Vue({
el: '#myapp',
data: {
// content: 'hello world'
content: '<h1>Title</h1>'
}
});
</script>
</body>
v-show v-if
- v-show 非表示にするだけ
- v-if 要素がなくなる
<div id="myapp">
<!-- <div v-show="showContent">
{{content}}
</div>
-->
<div v-if="showContent">
{{content}}
</div>
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
<script>
// v-show
// v-if
var vm = new Vue({
el: '#myapp',
data: {
content: 'hello world',
showContent: false
}
});
</script>
Class
TODO: 2.0 での記法
<div :class="{red: isRed, bold: isBold}">
{{content}}
</div>
v-for
1. 配列を繰り返したい場合は次のように書きます。
<ul>
<li v-for="d in d1">{{ d }}</li>
</ul>
2. オブジェクト(ハッシュ)に対しては丸括弧を使って次のように書きます。
<ul>
<li v-for="(k, d) in d2">{{ k }} - {{ d }}</li>
</ul>
3. オブジェクトの配列に対しては次のように書きます。
<ul>
<li v-for="d in d3">{{ d.name }} - {{ d.score }}</li>
</ul>
v-model フォームと連動させる
<div id="myapp">
<p>
<input type="text" v-model="name">
{{name}}
</p>
<p>
<input type="checkbox" v-model="isAdmin">
{{isAdmin ? "admin" : "not admin"}}
</p>
<p>
<input type="radio" name="phone" v-model="phone" value="iphone">
<input type="radio" name="phone" v-model="phone" value="android">
{{phone}}
</p>
<p>
<select v-model="city">
<option value="tokyo">tokyo</option>
<option value="kyoto">kyoto</option>
<option value="osaka">osaka</option>
</select>
{{city}}
</p>
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
<script>
// v-model
var vm = new Vue({
el: '#myapp',
data: {
name: 'taguchi',
isAdmin: true,
phone: 'iphone',
city: 'tokyo'
}
});
</script>
フィルター(値を処理 |)
- uppercase HELLO
- capitalize Hello
- carrency 通過記号
- json {{ $data | json }}
filterBy(抽出条件を設定)
<input type="text" v-model="keywordFil">
<ul>
<li v-for="user in users | filterBy 't' in 'name'">
{{user.name}} - {{user.score}}
</li>
</ul>
<ul>
<li v-for="user in users | filterBy keywordFil">
{{user.name}} - {{user.score}}
</li>
</ul>
<script>
var vm = new Vue({
el: '#myapp',
data: {
keywordFil: '',
users: [
{name: 'taguchi', score: 81},
{name: 'fkoji', score: 92},
{name: 'dotinstall', score: 64}
]
}
});
</script>
orderBy
「orderBy 'score' order」のように2番目のオプションをデータで管理し、降順にソートしたい場合は、データで管理しない場合と同様に -1 を指定します。
<li v-for="user in users | filterBy keyword | orderBy orderKey order">
{{user.name}} - {{user.score}}
</li>
data: {
keyword: '',
orderKey: 'score',
order: -1
}
v-on:keyup.enter
1. Enter キーを押した時に動作させたい場合
<input type="text" v-on:keyup.enter="showLength" v-model="msg">
これは v-on の省略記法を用いて次のようにも書けます。
<input type="text" @keyup.enter="showLength" v-model="msg">
※ なお、「left」や「right」は使用できますが「tab」は使用できません。
2. キーコードを指定する場合も同様にドットの後に記述します。
<input type="text" @keyup.65="showLength" v-model="msg">
Computed Property(コンピューテッド プロパティ)
<div id="myapp">
side: <input type="text" v-model="side">
<!-- area: {{area}} -->
area: <input type="text" v-model="area">
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
<script>
// computed property
var vm = new Vue({
el: '#myapp',
data: {
side: 20
},
computed: {
// area: function() {
// return this.side * this.side;
// }
// エリアに対して setter, getter
area: {
get: function() {
return this.side * this.side;
},
set: function(v) {
this.side = Math.sqrt(v);
}
}
}
});
</script>