JSライブラリ >
以下、バージョンの混在に注意。
CDNを利用する場合はインストールは不要。
※ただし後述する 単一ファイルコンポーネント等は使用できない。
<!-- 開発用 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- 開発用(バージョン指定) <script src="https://cdn.jsdelivr.net/npm/vue@2.5.22/dist/vue.js"></script> <!-- 本番用 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script> <!-- 本番用(バージョン指定) --> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.22/dist/vue.min.js"></script>
npm i -g npm to update npm install -g @vue/cli
vue-cli を使用してプロジェクトの作成やローカル起動、ビルド等を行う事ができる。
npm i -g npm to update npm install -g @vue/cli
vue create sample-project
cd sample-project npm run serve
※ http://localhost:8080/ で確認
npm run build
※ dist 以下に出力される
※ 参考: https://jp.vuejs.org/v2/guide/deployment.html
Vueインスタンスを生成する事により、画面にデータを描画する事ができる。
また、Vueインスタンスを介して描画内容を変更する事も可能。
以下の通りVueインスタンスを生成して画面描画等を行う。
var vm = Vue({ . . })
指定できるオプション
オプション | 内容 |
data | UIの状態/データ |
el | Vueインスタンスをマウントする要素 |
filters | データの整形に使用する |
methods | イベント発生時等の処理を関数として定義する |
computed | データから派生して算出される値を関数として定義する |
<div id="app"> {{ message }} </div> <script> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) // 2秒後にメッセージを書き換える setTimeout(function(){ app.message = 'Change message!' }, 2000); </script>
後から動的に読み込んだコンテンツをマウントする場合等は、$mount メソッドを利用する。
<div id="app"></div> <script> var vm = new Vue({ template: '<p>{{message}}</p>', data: { message : 'Message!' } }) vm.$mount('#app') </script>
filters プロパティを使用する事でローカルなフィルタを定義する事ができる
https://jp.vuejs.org/v2/guide/filters.html
<div id="app"> {{ message | toUpper }} </div> <script> var vue = new Vue({ el: '#app', data: { message: 'Hello World!' }, filters: { toUpper : function(text){ return text.toUpperCase() } } }) </script>
グローバルなフィルタを定義したい場合は、Vue.filter() を使用する
<div id="app"> {{ message | toUpper }} </div> <script> Vue.filter('toUpper', function(text) { return text.toUpperCase() }) var vue = new Vue({ el: '#app', data: { message: 'Hello World!' } })
computed プロパティ使用すると加工済みデータの描画等を行う事が出来る。
filters プロパティと違い、対象データはVueインスタンスから得る。
https://jp.vuejs.org/v2/guide/computed.html
<div id="app"> <p>Message : {{ message }}</p> <p>Upper message : {{ upperMessage }}</p> </div> <script> var vue = new Vue({ el: '#app', data: { message: 'Hello World!' }, computed: { upperMessage: function(value){ return this.message.toUpperCase(); } } }) </script>
Vue.js のリアクティブシステムによる検知/要素の更新の他に、$watchメソッドによる状態の監視を行う事もできる。
<div id="app"> <input type="text" v-model="message" /> </div> <script> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!', watch_message: '' } }) // メッセージが変わったらコンソールにログ出力 app.$watch(function(){ return this.message; }, function(){ console.log('changed!'); }); // 2秒後にメッセージを変更 setTimeout(function(){ app.message = 'Change message!' }, 2000); </script>
コンポーネントを利用する事で画面を部分的に部品化して再利用する事ができる。
参考: https://jp.vuejs.org/v2/guide/components.html
例) クリックカウンターボタンをコンポーネント化して再利用する
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.22/dist/vue.js"></script> </head> <body> <div id="components-demo"> <button-counter></button-counter> <button-counter></button-counter> </div> <script> Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click='count++'>click count is {{ count }}.</button>' }) new Vue({ el: '#components-demo' }) </script> </body> </html>
画面や部品単位でvueファイル化する事によってコンポーネント化する事ができる。
※以下、ドキュメントまま。
関連: Vue.jsでコンポーネント化された画面を切り替える
<template> <p>{{ greeting }} World!</p> </template> <script> module.exports = { data: function () { return { greeting: 'Hello' } } } </script> <style scoped> p { font-size: 2em; text-align: center; } </style>
https://jp.vuejs.org/v2/guide/events.html
v-if ディレクティブを使用して条件付きレンダリングを行う事ができる。
https://jp.vuejs.org/v2/guide/conditional.html
<div id="app"> <span v-if="display">Message1!</span> <span v-else>Message2!</span> </div> <script> var app = new Vue({ el: '#app', data: { display: true } }) // 2秒後に表示を切り替える setTimeout(function(){ app.display = false }, 2000); </script>
他に v-else-if や v-else も使用可能。
https://jp.vuejs.org/v2/guide/conditional.html#v-else
https://jp.vuejs.org/v2/guide/conditional.html#v-else-if