Vue.js サンプル
この章では、いくつかの Vue.js サンプルを紹介し、サンプルの練習を通じて学んだ知識を定着させます。
ナビゲーションメニューのサンプル
ナビゲーションメニュー
シンプルなナビゲーションメニューを作成します:
<div id="main">
<!--アクティブなメニューのスタイルは active クラスです。-->
<!--クリック時にリンクが遷移するのを防ぐため、"prevent" 修飾子(preventDefault の略)を使用します。-->
<nav v-bind:class="active" v-on:click.prevent>
<!--メニューのリンクがクリックされたとき、Vue インスタンス内で作成された makeActive メソッドを呼び出します。-->
<a href="#" class="home" v-on:click="makeActive('home')">Home</a>
<a href="#" class="projects" v-on:click="makeActive('projects')">Projects</a>
<a href="#" class="services" v-on:click="makeActive('services')">Services</a>
<a href="#" class="contact" v-on:click="makeActive('contact')">Contact</a>
</nav>
<!--以下の "active" 変数は、現在選択されている値に応じて自動的に変化します。-->
<p>あなたが選択したのは<b>{{active}} メニュー</b></p>
</div>
<script>// 新しい Vue インスタンスを作成
var demo = new Vue({
// DOM 要素、ビューモデルをマウント
el: '#main',
// プロパティを定義し、初期値を設定
data: {
active: 'home'
},
// メニュークリック時に使用する関数
methods: {
makeActive: function(item){
// モデルが変わると、ビューは自動的に更新されます
this.active = item;
}
}
});</script>
試してみる »
テキスト編集のサンプル
テキスト編集
指定したテキストをクリックして内容を編集:
<!--v-cloak は、Vue インスタンスの準備ができるまで未コンパイルの変数を非表示にします。-->
<!--要素をクリックすると hideTooltp() メソッドが呼び出されます。-->
<div id="main" v-cloak v-on:click="hideTooltip">
<!--これはツールチップです
v-on:click.stop はクリックイベントハンドラーで、stop 修飾子はイベントの伝播を防ぎます
v-if は show_tooltip が true のときのみ表示するために使います-->
<div class="tooltip" v-on:click.stop v-if="show_tooltip">
<!--v-model はテキストエリアの内容をバインドします
テキストエリアの内容が変わると、対応する変数もリアルタイムに変わります-->
<input type="text" v-model="text_content" />
</div>
<!--クリックすると "toggleTooltip" メソッドを呼び出し、イベントの伝播を防ぎます-->
<!--"text_content" 変数はテキストエリアの内容の変化に応じて変化します-->
<p v-on:click.stop="toggleTooltip">{{text_content}}</p>
</div>
<script>var demo = new Vue({
el: '#main',
data: {
show_tooltip: false,
text_content: 'クリックして、内容を編集してください。'
},
methods: {
hideTooltip: function(){
// モデルが変わると、ビューも自動的に更新されます
this.show_tooltip = false;
},
toggleTooltip: function(){
this.show_tooltip = !this.show_tooltip;
}
}
})</script>
試してみる »
注文リストのサンプル
注文リスト
注文リストを作成し、合計金額を計算します:
<form id="main" v-cloak>
<h1>Services</h1>
<ul>
<!--services 配列をループ出力し、オプションクリック後のスタイルを設定します-->
<li v-for="service in services" v-on:click="toggleActive(service)" v-bind:class="{ 'active': service.active}">
<!--注文のサービス名と価格を表示します
Vue.js は価格をフォーマットするための通貨フィルターを定義しています-->
{{service.name}} <span>{{service.price | currency}}</span>
</li>
</ul>
<div class="total">
<!--すべてのサービスの価格を計算し、通貨をフォーマットします-->
Total: <span>{{total() | currency}}</span>
</div>
</form>
<script>// カスタムフィルター "currency"
Vue.filter('currency', function (value) {
return '$' + value.toFixed(2);
});
var demo = new Vue({
el: '#main',
data: {
// モデルのプロパティを定義
// ビューは配列のデータをループ出力します
services: [
{
name: 'Web Development',
price: 300,
active:true
},{
name: 'Design',
price: 400,
active:false
},{
name: 'Integration',
price: 250,
active:false
},{
name: 'Training',
price: 220,
active:false
}
]
},
methods: {
toggleActive: function(s){
s.active = !s.active;
},
total: function(){
var total = 0;
this.services.forEach(function(s){
if (s.active){
total+= s.price;
}
});
return total;
}
}
});</script>
試してみる »
検索ページのサンプル
検索ページ
入力ボックスに検索内容を入力すると、リストに設定されたリストが表示されます:
<form id="main" v-cloak>
<div class="bar">
<!--searchString モデルはテキストフィールドとバインドされます-->
<input type="text" v-model="searchString" placeholder="検索内容を入力" />
</div>
<ul>
<!--データをループ出力-->
<li v-for="article in filteredArticles">
<a v-bind:href="article.url"><img v-bind:src="article.image" /></a>
<p>{{article.title}}</p>
</li>
</ul>
</form>
<script>var demo = new Vue({
el: '#main',
data: {
searchString: "",
// データモデル。実際の環境ではAjaxを使って取得できます
articles: [
{
"title": "What You Need To Know About CSS Variables",
"url": "https://www.example.com/css/css-tutorial.html",
"image": "/static.jyshare.com/images/icon/css.png?v=2"
},
{
"title": "Freebie: 4 Great Looking Pricing Tables",
"url": "https://www.example.com/html/html-tutorial.html",
"image": "/static.jyshare.com/images/icon/html.png?v=2"
},
{
"title": "20 Interesting JavaScript and CSS Libraries for February 2016",
"url": "https://www.example.com/css3/css3-tutorial.html",
"image": "/static.jyshare.com/images/icon/css3.png?v=2"
},
{
"title": "Quick Tip: The Easiest Way To Make Responsive Headers",
"url": "https://www.example.com/css3/css3-tutorial.html",
"image": "/static.jyshare.com/images/icon/css3.png?v=2"
},
{
"title": "Learn SQL In 20 Minutes",
"url": "https://www.example.com/sql/sql-tutorial.html",
"image": "/static.jyshare.com/images/icon/sql.png?v=2"
},
{
"title": "Creating Your First Desktop App With HTML, JS and Electron",
"url": "https://www.example.com/js/js-tutorial.html",
"image": "/static.jyshare.com/images/icon/html.png?v=2"
}
]
},
computed: {
// 算出プロパティ。検索に一致
filteredArticles: function () {
var articles_array = this.articles,
searchString = this.searchString;
if(!searchString){
return articles_array;
}
searchString = searchString.trim().toLowerCase();
articles_array = articles_array.filter(function(item){
if(item.title.toLowerCase().indexOf(searchString) !== -1){
return item;
}
})
// フィルタリングされたデータを返す
return articles_array;;
}
}
});</script>
試してみる »
異なるレイアウトの切り替えサンプル
異なるレイアウトの切り替え
右上隅のボタンをクリックして、異なるページレイアウトを切り替えます:
<form id="main" v-cloak>
<div class="bar">
<!--2つのボタンで異なるリストレイアウトを切り替えます-->
<a class="list-icon" v-bind:class="{ 'active': layout == 'list'}" v-on:click="layout = 'list'"></a>
<a class="grid-icon" v-bind:class="{ 'active': layout == 'grid'}" v-on:click="layout = 'grid'"></a>
</div>
<!--2つのレイアウトページを用意しました。どちらを使用するかは「layout」バインディングに依存します-->
<ul v-if="layout == 'grid'" class="grid">
<!--大きな画像を使用し、テキストなし-->
<li v-for="a in articles">
<a v-bind:href="a.url" target="_blank" rel="noopener noreferrer"><img v-bind:src="a.image.large" /></a>
</li>
</ul>
<ul v-if="layout == 'list'" class="list">
<!--小さな画像とタイトルを使用-->
<li v-for="a in articles">
<a v-bind:href="a.url" target="_blank" rel="noopener noreferrer"><img v-bind:src="a.image.small" /></a>
<p>{{a.title}}</p>
</li>
</ul>
</form>
<script>var demo = new Vue({
el: '#main',
data: {
// ビューモデル。指定可能な値は "grid" または "list" です。
layout: 'grid',
articles: [{
"title": "HTML チュートリアル",
"url": "https://www.example.com/html/html-tutorial.html",
"image": {
"large": "/static.jyshare.com/images/mix/htmlbig.png?v=2",
"small": "/static.jyshare.com/images/icon/html.png?v=2"
}
},
{
"title": "CSS チュートリアル",
"url": "https://www.example.com/css/css-tutorial.html",
"image": {
"large": "/static.jyshare.com/images/mix/cssbig.png?v=2",
"small": "/static.jyshare.com/images/icon/css.png?v=2"
}
},
{
"title": "JS チュートリアル",
"url": "https://www.example.com/js/js-tutorial.html",
"image": {
"large": "/static.jyshare.com/images/mix/jsbig.jpeg?v=2",
"small": "/static.jyshare.com/images/icon/js.png?v=2"
}
},
{
"title": "SQL チュートリアル",
"url": "https://www.example.com/sql/sql-tutorial.html",
"image": {
"large": "/static.jyshare.com/images/mix/sqlbig.png?v=2",
"small": "/static.jyshare.com/images/icon/sql.png?v=2"
}
},
{
"title": "Ajax チュートリアル",
"url": "https://www.example.com/ajax/ajax-tutorial.html",
"image": {
"large": "/static.jyshare.com/images/mix/ajaxbig.png?v=2",
"small": "/static.jyshare.com/images/icon/ajax.png?v=2"
}
},
{
"title": "Python チュートリアル",
"url": "https://www.example.com/pyhton/pyhton-tutorial.html",
"image": {
"large": "/static.jyshare.com/images/mix/pythonbig.png?v=2",
"small": "/static.jyshare.com/images/icon/python.png?v=2"
}
}]
}
});</script>
試してみる »