Memo

メモ > 技術 > フレームワーク: Vue.js > 便利な機能

■便利な機能
■スロットを使う C:\localhost\home\refirio_org\public_html\memos\vuejs_project\hello_app\src\App.vue
<HelloWorld title="HelloWorld" message="Welcome to Your Vue.js App!"> <p>This is sample compoment.</p> </HelloWorld>
C:\localhost\home\refirio_org\public_html\memos\vuejs_project\hello_app\src\components\HelloWorld.vue
<template> <div class="hello"> <h1>{{ title }}</h1> <p>{{ message }}</p> <hr> <div><slot /></div> </div> </template>
<slot /> の部分に「This is sample compoment.」が表示される ■名前付きスロットを使う C:\localhost\home\refirio_org\public_html\memos\vuejs_project\hello_app\src\App.vue
<HelloWorld title="HelloWorld" message="Welcome to Your Vue.js App!"> <p>This is sample compoment.</p> <p slot="a">Message A.</p> <p slot="b">Message B.</p> </HelloWorld>
C:\localhost\home\refirio_org\public_html\memos\vuejs_project\hello_app\src\components\HelloWorld.vue
<template> <div class="hello"> <h1>{{ title }}</h1> <p>{{ message }}</p> <hr> <div><slot /></div> <div><slot name="a" /></div> <div><slot name="b" /></div> </div> </template>
<slot name="a" /> の部分に「Message A.」が表示される <slot name="b" /> の部分に「Message B.」が表示される ■アニメーション C:\localhost\home\refirio_org\public_html\memos\vuejs_project\hello_app\src\App.vue
<template> <div id="app"> <HelloWorld title="HelloWorld"/> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } </script>
C:\localhost\home\refirio_org\public_html\memos\vuejs_project\hello_app\src\components\HelloWorld.vue
<template> <div class="hello"> <h1>{{ title }}</h1> <p>{{ message }}</p> <hr> <button v-on:click="doAction"> {{ btn }} </button> <transition name="transit"> <p v-if="flg" class="trans">トランジション</p> </transition> </div> </template> <script> export default { name: 'HelloWorld', props: { title: String, }, data: function() { return { message: 'Transition Sample!', flg: true, btn: '表示/非表示', }; }, methods: { doAction: function() { this.flg = !this.flg; } } } </script> <style> /* 共通 */ .trans { width: 150px; background-color: #FFDDDD; padding: 10px; color: #FF4500; } .transit-enter-active { transition: 1.0s; } .transit-leave-active { transition: 1.0s; } /* フェードイン・フェードアウト */ /* .transit-enter-active { transition: opacity 1.0s; } .transit-leave-active { transition: opacity 1.0s; } .transit-enter { opacity: 0; } .transit-enter-to { opacity: 1.0; } .transit-leave { opacity: 1.0; } .transit-leave-to { opacity: 0; } */ /* 平行移動 */ /* .transit-enter, .transit-leave-to { transform: translateX(200px) translateY(-200px); opacity: 0.1; } */ /* 拡大縮小 */ /* .transit-enter, .transit-leave-to { transform: scale(5.0); opacity: 0.1; } */ /* 回転 */ /* .transit-enter, .transit-leave-to { transform: rotateZ(360deg); opacity: 0.1; } */ </style>
■計算アプリを作成
>cd C:\localhost\home\refirio_org\public_html\memos\vuejs_project >vue create calc_app >cd calc_app >npm run serve
C:\localhost\home\refirio_org\public_html\memos\vuejs_project\calc_app\src\App.vue
<template> <div id="app"> <Calc v-bind:title="message" v-on:result-event="endCalculate"/> <hr> <div><table v-html="log"></table></div> </div> </template> <script> import Calc from './components/Calc.vue' export default { name: 'app', components: { Calc }, data: function() { return { message: 'Calculation', result: [] }; }, created: function() { // インスタンスが生成されたとき var log = localStorage.getItem('log'); if (log != null) { this.result = JSON.parse(log); } }, computed: { // 値が変わったとき log: function() { var table = '<tr><th>式</th><th>値</th></tr>'; for (var i in this.result) { table += '<tr><td>' + this.result[i][0] + '</td><td>' + this.result[i][1] + '</td></tr>'; } return table; } }, methods: { // メソッド endCalculate: function(exp, res) { this.result.unshift([exp, res]); var log = JSON.stringify(this.result); localStorage.getItem('log', log); } } } </script> <style> table th, table td { border: 1px solid #000; } </style>
C:\localhost\home\refirio_org\public_html\memos\vuejs_project\calc_app\src\components\Calc.vue
<template> <div> <h1>{{ title }}</h1> <p>{{ message }}</p> <p> <input size="30" value="" v-model="formula"> <button v-on:click="calculate">計算する</button> </p> </div> </template> <script> export default { name: 'Calc', props: { title: String, }, data: function() { return { message: '式を入力してください:', formula: '', }; }, methods: { // メソッド calculate: function() { var expression = 'function f() { return ' + this.formula + '; } f();'; var answer = eval(expression); this.message = '計算結果: ' + answer; this.$emit('result-event', this.formula, answer); } } } </script>

Advertisement