Vue.js:サービスを定義する


84

私はAngularの代わりとしてVue.jsを見ていますが、これまでのところ本当に気に入っています。その感覚をつかむために、私は既存のAngularプロジェクトをVueプロジェクトにリファクタリングしています。私はRESTAPIと通信する必要があるところです。

Angularでは、そのためのサービスを定義していました。それは、それを必要とするすべてのコントローラーに注入されました。私が理解しているように、Vueは「サービス」構造を知らないようです。これはVueでどのように達成できますか?

私は考えましたがvue-resource、私が理解している限り、それはhttp機能のためだけです。私もjQueryを使用しているので、これは廃止されました。

例:

私は持っvueComponent1ていvueComponent2ます。どちらも同じRESTリソースにアクセスする必要があります。これを処理するには、両方のコンポーネントがRESTリソースへの要求に使用できる中央サービスが必要です。Angularには「サービス」コンポーネントがあり、まさにそれを実行します。Vueはしていません。


必要なものの具体例を提供してください。RESTと通信するにはhttpで十分です
gurghet 2016

vue-resourceをご覧ください
nils 2016

回答:


96

Vue.jsのドキュメントから。

Vue.js自体は本格的なフレームワークではなく、ビューレイヤーのみに焦点を当てています。

MVCのVに焦点を当てたライブラリとして、サービスなどは提供していません。

BrowserifyやWebpackなどのモジュールローダーを使用していますか?
次に、ES6のモジュールシステムを活用して、すべて自分でサービスを作成できます。
あなたがしなければならないのは、この新しいモジュールによってエクスポートされているプレーンなJavaScriptクラスを作成することです。

例は次のようになります。

export default class RestResource {

  sendRequest() {
    // Use vue-resource or any other http library to send your request
  }

}

vueコンポーネント1および2内で、クラスをインポートすることでこのサービスを使用できます。

import RestResource from './services/RestResource';

const restResourceService = new RestResource();

restResourceService.sendRequest();

2
見積もりありがとうございます。これは、ビューとモデルの下に構造や何かがないことを意味します。サービスが必要な場合は、純粋なJSを使用するなどして独自のサービスを構築する必要があります。
Herr Derb 2016

私はそうだmovieslist.vue?1be4:38Uncaught TypeError: _resource.Resource is not a constructor、私はこれを使用する場合...
ジョージKatsanos

13
Angularの背景で期待するものとの大きな違いが1つ欠けています。この場合、「サービス」は複数回インスタンス化されますが、共有サービスインジェクションでは、1つのインスタンスのみが渡されます
phil294 2018年

1
ええ、この方法で同じサービスの複数のインスタンスを取得します。Ajaxリクエストを実行するだけの場合(単に非効率的)は問題ありませんが、データモデルにサービスを使用する場合は、サービスを宣言する場所でサービスをインスタンス化し、インスタンスのみをエクスポートする必要があります。
mcv 2018

2
「Angularスタイル」のシングルトンサービスが必要な場合は、アプリのどこかにこのクラスのインスタンスを作成してエクスポートし、export const restResourceService = new RestResource();必要な場所にインポートするだけです。しかし、これは私たちが自分たちで作成した問題の解決策を実際に作成しています-なぜ関数を使用しないのですか? export function sendRequest() { // Make the request } 最後に、httpリクエストを行うために必ずしもライブラリが必要なわけではないことに注意してください。プロジェクトの要件によっては、JavaScriptAPIを使用するだけで済みfetchます。
テイラー

21

大規模アプリの構築に関するVue.jsのドキュメントから。

コミュニティは、RESTfulAPIを操作する簡単な方法を提供するvue-resourceプラグインを提供しています。$ .ajaxやSuperAgentなど、好きなAjaxライブラリを使用することもできます。

Vueは、MVCまたはMVVMアーキテクチャのビューレイヤーのみを参照するため、特定のアーキテクチャに従う必要はありません。以下のよう@Marcは、すでに述べた彼の答え、良い練習はあなたが必要なところ、彼らのインポート、別々のファイルにあなたの「サービス」を作成できるようにBrowserifyまたはWebPACKのようなモジュールローダを使用することです。vue-cliを使用してモジュールローダーでアプリを構築するのは非常に簡単です。

確かに、私は個人的にコンポーネントベースのアプリのFluxアーキテクチャが本当に好きです。次に、Vue.jsアプリ内の状態を管理するために特別に設計されたFluxに触発されたアプリケーションアーキテクチャであるVuexを確認することをお勧めします。

このようにして、vue-resourceを使用してAPIをリクエストするアクションを作成し、データが到着したときにミューテーションをディスパッチできます。そのデータを必要とするすべてのコンポーネントは、すでにグローバル状態にバインドされており、自動的に反応します。つまり、コンポーネント自体がサービスを呼び出す必要はなく、Mutationsによってディスパッチされた状態の変更に反応するだけです。


4
vue-resourceは公式には推奨されなくなったことに注意してください。ソース
lightswitch05 2018

1
詳細をチェックアウト:退任VUE-リソースエヴァンあなたによって書かれた
JeffMinsungKim

17

サービスのクラスのインスタンスをエクスポートできます。

export default new class {
   ...
}

コンポーネントまたはその他の場所で、インスタンスをインポートでき、常に同じインスタンスを取得できます。このように、注入されたAngularサービスと同様に動作しthisますが、を使用しません。

import myService from '../services/myservice';

Vue.component('my-component', {
  ...
  created: function() {
    myService.oneFunction();
  }
  ...
})

11

この質問には、非常に良い答えがいくつかあります。VueJSのAngular Serviceに相当するものは何ですか?

@Otabek Kholikovが言うように、4つのオプションがあります。

  1. ステートレスサービス:ミックスインを使用する必要があります
  2. ステートフルサービス:Vuexを使用する
  3. サービスのエクスポートとVUEコードからのインポート
  4. 任意のjavascriptグローバルオブジェクト

私のプロジェクトでは(4)が好きです。それは私に最大の柔軟性を与え、私が必要とする実装だけを持っています(私は例えばVuexを持ってこないので、そのルールに厳密であるべきではなく、「魔法」はありません-すべてのコードは私のものです)。上記の質問に実装例があります。


6

モジュールローダーを使用していない場合は、カスタムプラグインを定義できます。いくつかのサンプルコード:

var myPlugin = {
        install: function (Vue, options) {
            //private
            var myPrivateProperty = 'Private property';

            //instance properties and methods
            Vue.prototype.$myPublicProperty = 'Public Property';

            Vue.prototype.$myAddedMethod = function () {
                return myPrivateProperty;
            };
            Vue.prototype._getData = function (url) {
                return url;
            };

            //static properties and methods
            Vue.myStaticProperty = 'My static prop';
            Vue.myStaticMethod = function () {
                console.log('in');
            }
        }
    };

    Vue.use(myPlugin);

    new Vue({
        el: '#app',
        created: function () {
            //using instance
            console.log(this.$myAddedMethod());
            console.log('my get data: ' + this._getData('some url'));
            console.log(this.$myPublicProperty);

            //using static
            console.log(Vue.myStaticProperty);
            Vue.myStaticMethod();
        }
    });

他のライブラリをプラグインすることもできます。この投稿では、axios.jsをプラグインする方法を示しています。


1

vueリソースをグローバルに次のように構成できます

Vue.http.options.root = "your base url"

そして今、すべてのhttp呼び出しで、リソースの名前で簡単に呼び出すことができます-

this.$http.get('');
this.$http.get('users')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.