VueをTypescriptで実装しようとしたら、方法がさまざまあって手こずる。Vue2を使用していますがVue3に向けてどれで慣れておいたらいいのかも迷う。
上のような表示をするだけのヤツを実装方法を変えて3つ。
- vue-class-component
- vue-property-decorator
- Vue.extend
どれもWebpackを使ってバンドルしています。あとデバッグ用なので特に必要はないですがwindow.appというグローバル変数を作成(global.d.ts)して、ViewModelをグローバルへ露出させています。
一つ目は「vue-class-component」
以下はソースの一部です、デコレータ部分がおっきくなりますね。あとpropへの参照が「$prop」とかエディタのサジェスト機能で初めて知りました。
import Vue from 'vue'; import Component from "vue-class-component"; @Component({ template:'<li v-on:click="onClick">{{name}}</li>', props:{ name:String } }) class MyData extends Vue{ onClick = ():void =>{ console.log(this.$props.name); } }
二つ目、「vue-property-decorator」を加えて
propをクラス内に書けるようになってスッキリ、VueとTypescriptの型宣言が二重になってて冗長ですけど。
import {Component, Prop, Vue} from "vue-property-decorator"; @Component({ template:'<li v-on:click="onClick">{{name}}</li>', }) class MyData extends Vue{ @Prop({type:String}) name:string onClick = ():void =>{ console.log(this.name); } }
三つ目、「Vue.extend」で、
最後にVue.extendを使用して、さらにSFC(シングルファイルコンポーネント)です。@vue/cliで簡単にSFCのバンドル環境を整えられますが、理解の妨げになるので使わずwebpack.donfig.jsはTypeScript Vue Starter[github.com]を参考にしています。
Elecrtonへ乗せる事も視野に、コンテンツセキュリティポリシー (CSP)は「unsafe-eval」を外しても動くようにVueはテンプレートコンパイラを含まないvue.runtime.esm.jsをバンドル。Developmentモードでのビルドはeval関数が含まれてしまいますのでProductionモードでビルドするようwebpack.config.jsで指定しています。
<template> <li v-on:click="onClick">{{name}}</li> </template> <script lang="ts"> import Vue from "vue"; export default Vue.extend({ props:{ name:{type:String} }, methods:{ onClick():void { console.log(this.name); } } }) </script> <style scoped> </style>
vue-class-componentと比べてVueの記述寄りになって見やすくなったかな。propの型指定でそのうちつまずきそうな予感ですけど。