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>

注文リストの例

注文リスト

注文リストを作成し、合計金額を計算します。

<!--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>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です