この記事では、いくつかの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>
注文リストの例
注文リスト
注文リストを作成し、合計金額を計算します。
<!--v-cloakは、Vueインスタンスの準備ができるまで、コンパイルされていない変数を非表示にする -->
<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: {
// モデルのプロパティを定義する the model properties. The view will loop
// ビューはループして配列のデータを出力する
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": "Know more about vue",
"url": " https://www.ceodata.com/trying-vue-js/",
"image": "https://www.ceodata.com/files/css.png"
},
{
"title": "Vue.js installing",
"url": " https://www.ceodata.com/install-vue-js/",
"image": "https://www.ceodata.com/files/html.png"
},
{
"title": "what’s difference between Python 3 and Python 2",
"url": " https://www.ceodata.com/difference-between-python-2-and-3/",
"image": "https://www.ceodata.com/files/css3.png"
},
{
"title": "Python 3 turotial",
"url": "https://www.ceodata.com/python-3-tutorial/",
"image": "https://www.ceodata.com/files/css3.png"
},
{
"title": "Mode function in Excel",
"url": " https://www.ceodata.com/excel-mode-function/",
"image": "https://www.ceodata.com/files/sql.png"
},
{
"title": "abs function in excel",
"url": "https://www.runoob.com/js/js-tutorial.html",
"image": "https://www.ceodata.com/files/html.png"
}
]
},
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"><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"><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.ceodata.com",
"image": {
"large": "https://www.ceodata.com/files/htmlbig.png",
"small": "https://www.ceodata.com/files/html.png"
}
},
{
"title": "CSS",
"url": "https://www.ceodata.com",
"image": {
"large": "https://www.ceodata.com/files/cssbig.png",
"small": "https://www.ceodata.com/files/css.png"
}
},
{
"title": "JS",
"url": "https://www.ceodata.com",
"image": {
"large": "https://www.ceodata.com/files/jsbig.jpg",
"small": "https://www.ceodata.com/files/js.png"
}
},
{
"title": "SQL",
"url": "https://www.ceodata.com",
"image": {
"large": "https://www.ceodata.com/files/sqlbig.png",
"small": "https://www.ceodata.com/files/sql.png"
}
},
{
"title": "Ajax",
"url": "https://www.ceodata.com",
"image": {
"large": "https://www.ceodata.com/files/ajaxbig.png",
"small": "https://www.ceodata.com/files/ajax.png"
}
},
{
"title": "Python",
"url": "https://www.ceodata.com",
"image": {
"large": "https://www.ceodata.com/files/pythonbig.png",
"small": "https://www.ceodata.com/files/python.png"
}
}]
}
});
</script>
コメントを残す