双方向データバインディングができるシンプルなフレームワーク「Vue.js」を使ってみます。
インストール
Vue.jsのサイトにアクセスしてインストールボタンをクリック。

インストール方法はいくつかありますが、今回はダウンロードして使用したいので、スタンドアロン > プロダクションバージョン をクリックしてダウンロードしました。

Hello Worldの表示
公式サイトのガイドに掲載されているサンプルを試してみます。
まずはHello Worldという文字列を表示してみます。
HTML
<div id="app">
{{ message }}
</div>
JavaScript
new Vue({
el: '#app',
data: {
message: 'Hello World!!'
}
})
elでHTML要素を指定して、バインド対象範囲を決めます。
dataはバインドする値を指定します。
今回の場合、data内のmessageとHTML側の{{ message }}を紐づけています。
Hello Worldのデモページ
双方向バインディング
inputに入力する内容をリアルタイムで表示させてみます。
HTML
<div id="demo">
<p>{{message}}</p>
<input v-model="message">
</div>
JavaScript
var demo = new Vue({
el: '#demo',
data: {
message: '入力してください'
}
})
inputにv-model=”message”とすることで、data内のmessageと紐づけしています。
双方向バインディングのデモページ
リストのレンダリング
配列の内容を繰り返し表示してみます。
HTML
<div id="app">
<ul>
<li v-for="story in stories">
{{ story.subtitle }}
</li>
</ul>
</div>
JavaScript
new Vue({
el: '#app',
data: {
stories: [
{ subtitle: 'パンの耳ですわ' },
{ subtitle: 'カラダにいいのはおいしくないものだよ' },
{ subtitle: 'メイドの味がした' },
{ subtitle: 'むしろ生きがいです' },
{ subtitle: 'もうこはんはもうないんですね' },
{ subtitle: '野菜肉肉肉肉肉肉魚' },
{ subtitle: '十円足りない' },
{ subtitle: 'たくさん釣れてる' },
{ subtitle: 'カレーは二日目' },
{ subtitle: '鶏肉とケーキを食べまくる日' },
{ subtitle: 'チョコを食べまくる日' },
{ subtitle: 'もうパンの耳は卒業しますわ' }
]
}
})
v-forは配列のデータをループ処理します。
リストのレンダリングのデモページ
ユーザー入力のハンドリング
ユーザーのアクションによって値を変更させてみます。
HTML
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">Reverse Message</button>
</div>
JavaScript
new Vue({
el: '#app',
data: {
message: '三者三葉'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})
methodsはイベントなどから呼び出す処理を設定します。
今回の場合、v-on:click=”reverseMessage”でクリック時にmethods内で設定しているreverseMessageを呼び出しています。
ユーザー入力のハンドリングのデモページ
Todoアプリ
リロードすると消えますが、データの追加と削除を行えるTodoアプリを作ってみます。
HTML
<div id="app">
<input v-model="newStory" v-on:keyup.enter="addStory">
<ul>
<li v-for="story in stories">
<span>{{ story.subtitle }}</span>
<button v-on:click="removeStory($index)">X</button>
</li>
</ul>
</div>
JavaScript
new Vue({
el: '#app',
data: {
newStory: 'もうパンの耳は卒業しますわ',
stories: [
{ subtitle: 'パンの耳ですわ' },
{ subtitle: 'カラダにいいのはおいしくないものだよ' },
{ subtitle: 'メイドの味がした' },
{ subtitle: 'むしろ生きがいです' },
{ subtitle: 'もうこはんはもうないんですね' },
{ subtitle: '野菜肉肉肉肉肉肉魚' },
{ subtitle: '十円足りない' },
{ subtitle: 'たくさん釣れてる' },
{ subtitle: 'カレーは二日目' },
{ subtitle: '鶏肉とケーキを食べまくる日' },
{ subtitle: 'チョコを食べまくる日' }
]
},
methods: {
addStory: function () {
var text = this.newStory.trim()
if (text) {
this.stories.push({ subtitle: text })
this.newStory = ''
}
},
removeStory: function (index) {
this.stories.splice(index, 1)
}
}
})
【参考サイト】
コメントが承認されるまで時間がかかります。