ブラウザだけで動作するVue 3のサンプル。以下の公式ドキュメントを参考にしました。
サンプル
Vue 3のサンプルは、このページになります。 また、このソースは以下になります。 Vue 3ではVue 2と異なり、createApp関数を使用します。また、dataの箇所は、data() { return ... } の形式にする必要があります。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue3のテスト</title> <script src="https://unpkg.com/vue@3"></script> </head> <body> <div id="app"></div> <div id="basic-event"> <!-- '@click' は、'v-on:click' にすることもできる。 --> <button @click="counter += 1">ボタン1</button> <p>ボタン1のクリック数 {{ counter }} 回</p> </div> <div id="event-with-method"> <button @click="greet">ボタン2</button> <br><br> </div> <div id="multiple-event"> <button @click="one($event), two($event)">ボタン3 (+3)</button> <p>ボタン3のクリック数 {{ counter }} 回。 合計は {{ sum }}</p> </div> <script> const app = Vue.createApp({ template: '<p>{{msg}}</p><br>', data() { return { msg: 'これはVue3のテストです。' }; } }); app.mount('#app'); // ボタン1: Listening to Events const bt1 = Vue.createApp({ data() { return { counter: 0 } } }) bt1.mount('#basic-event'); // ボタン2: Method Event Handlers Vue.createApp({ data() { return { name: 'Vue.js' } }, methods: { greet(event) { // `this` inside methods points to the current active instance alert('Hello ' + this.name + '!') // `event` is the native DOM event if (event) { alert(event.target.tagName) } } } }).mount('#event-with-method') // ボタン3: Multiple Event Handlers Vue.createApp({ data() { return { counter: 0, sum: 0 } }, methods: { one(event) { this.counter += 1; }, two(event) { this.sum += 3; } } }).mount('#multiple-event') </script> </body> </html>
Vue 2のサンプルは、以下になります。
Reactで同じ機能を実装したサンプルは、以下になります。
フィルター
Vue 3では、フィルターが使用できなくなりました。代わりに関数をcomputedで定義して使用します。
例
<script src="https://unpkg.com/vue@3"></script> <div id="app"></div> <script> function showPrice(value) { return value + ' 円'; } var items = [ { name: 'みかん', price: 100, quantity: 2 }, { name: 'りんご', price: 200, quantity: 3 }, ]; var app = Vue.createApp({ template: ` <dl v-for="item in items"> <dt>{{ item.name }}: {{ price(item.price) }} x {{ item.quantity }} = {{ price(sum(item)) }}</dt> </dl> <p>合計: {{ total }}</p> `, data() { return { items: items }; }, computed: { price() { return function (item) { return showPrice(item); } }, sum: function () { return function (item) { return item.price * item.quantity; } }, total: function () { const value = this.items.reduce(function (sum, item) { return sum + (item.price * item.quantity); }, 0) return showPrice(value) }, } }) app.mount('#app'); </script>この例では、computedで3つの関数を定義して、テンプレートでそれらを使用しています。
Vue 2 の場合、price関数をフィルタで定義すると、以下のようになります。
これをVue 3で実行すると、filterの定義は無視されてしまいます。
... data() { ... }, filters: { price: function (value) { return showPrice(item); } }, computed: { ...
価格表示用関数showPriceは、computedで定義せずに、外部で定義していますが、これは、以下のような外部モジュールとすることもできます。 ただし、importを使用する場合、scriptタグに tyep="module" を指定する必要があります。
<script type="module"> import { showPrice } from 'http://localhost/js/vue3_lib.js'; var items = [ ... </script>注意 IEでは、importを使えません。