2017-09-06 9 views
1

アプリケーションを開発するときに問題が発生しました。 Vue + Vuetifyでtypescriptを使用しますが、SPAアプリケーションを作成したり、.vueコンポーネントで作業するためにwebpackを使用したりする必要はありません。新しいVueインスタンスを毎回作成するいくつかのページを作成する必要があります。しかし、私は例コンポーネントなしのTypeScriptを使用したVue

import * as Vue from 'Vue'; 
import axios from 'axios'; 

<any>window.vue = new Vue({ 
    el: "#app", 
    data: { 
     drawer: true, 
     mini: false, 
     totalItems: 0, 
     items: [], 
     headers: [, 
      { 
       text: 'Dessert (100g serving)', 
       align: 'left', 
       sortable: false, 
       value: 'name' 
      }, 
      { text: 'Calories', value: 'calories' }, 
      { text: 'Fat (g)', value: 'fat' }, 
     ], 

    }, 
methods: { 

    getData() { 
     axios.get("http://exmaple1234.com/api/list") 
      .then((response) => { 
       this.$data["totalItems"] = 1; 
       this.$data["items"] = [ 
        { 
         value: false, 
         name: 'Frozen Yogurt', 
         calories: 159, 
         fat: 6.0, 
        } 
       ]; 
      }) 
    } 
}, 
mounted() { 
    this.$options.methods["getData"].call("getData"); 

}, 
}); 

私はthis.totalItems、this.itemsを使用することはできませんし、私はthis.getDataを呼び出すことはできませんtypescriptですと私のtsconfig.json

{ 
    "compilerOptions": { 
    "alwaysStrict": true, 
    "noImplicitAny": false, 
    "noEmitOnError": true, 
    "removeComments": true, 
    "sourceMap": false, 
    "target": "es5", 
    "moduleResolution": "node", 
    "allowSyntheticDefaultImports": true, 
    "lib": [ "es2017", "dom", "dom.iterable" ] 
    }, 
    "exclude": [ 
    "node_modules" 
    ], 
    "compileOnSave": true 
} 

()内のために作成したとき()、しかし、私は私のコードをブラウザでデバッグするとき、私はそのオブジェクト "this"がこれらのすべてのプロパティとメソッドを持っているのを見ます。

プロパティ$ data ["property"] nameと$ options.methods ["methodName"]を使用して作業しますが、これは正しいアプローチではないことを理解しています。 インタフェースまたはvue-class-componentの作成に役立つComponentOptionsについては、Vueのドキュメントを読んでいますが、これらのツールはすべて避けたいコンポーネントを使用しています。

この場合、vue + typescriptを使用できますか?私は私の質問のヒントをお礼したいと思います。

答えて

0

私はすべてのデータの属性とメソッドを記述するためのインターフェースを追加しました。 this.getData();/this.$options.methods["getData"].call(this);を追加し、新しいvueインスタンスを作成しました。

import * as Vue from 'Vue'; 
import axios from 'axios'; 

interface AppInterface extends Vue { 
    drawer: boolean, 
    mini: boolean, 
    totalItems: number, 
    items: any, 
    headers: any, 
    getData(): void 
} 

var App = { 
    el: "#app", 
    data: { 
     drawer: true, 
     mini: false, 
     totalItems: 0, 
     items: [], 
     headers: [{ 
       text: 'Dessert (100g serving)', 
       align: 'left', 
       sortable: false, 
       value: 'name' 
      }, { 
       text: 'Calories', 
       value: 'calories' 
      }, { 
       text: 'Fat (g)', 
       value: 'fat' 
      } 
     ] 
    }, 
    methods: { 
     getData() { 
      axios 
       .get("http://exmaple1234.com/api/list") 
       .then((response) => { 
        this.$data["totalItems"] = 1; 
        this.$data["items"] = [ 
         { 
          value: false, 
          name: 'Frozen Yogurt', 
          calories: 159,  
          fat: 6.0 
         } 
        ]; 
       }) 
     } 
    }, 
    mounted() { 
     // or this.$options.methods["getData"].call(this); 
     this.getData(); 
    } 
} as Vue.ComponentOptions<AppInterface> 

// new vue instance 
new Vue(App); 
+0

データは、メインのvueインスタンスの関数である必要はありません。ミックスインやコンポーネントのようなもののための関数である必要があります。 –

+0

この場合、あなたの権利。あなたは1つのインスタンスでそれを行うことができますが、推奨されません。このエラーを見てください: '[Vue warn]:" data "オプションは、コンポーネント定義のインスタンスごとの値を返す関数でなければなりません。またはこの短い投稿:https://vuejs.org/2016/02/06/common-gotchas/#Why-does-data-need-to-be-a-function ...私は自分の投稿を更新します。 – Phil

+2

もちろん、vueインスタンスは関数ではなくdataプロパティにオブジェクトを使用することをお勧めします。実際には、vueインスタンスを作成するためのドキュメントはデータ用の関数を使用していません。参照:https://vuejs.org/v2/guide/instance.htmlあなたが挙げた[Vue警告]エラーメッセージは、コンポーネントに関するものです。また、コンポーネントでは、データを返す関数を使用することが非常に重要ですが、これはメインのVUEインスタンスには適用されません。 –

関連する問題