2017-01-13 15 views
4

LinusBorg hereのソリューションが見つかりました。バスはどのVueインスタンスにもグローバルに登録されています。代わりに複数のスコープ付きバスを作成できるように、これをコンポーネント階層で定義する方法はありますか?基本的に、いくつかの子を持つ複数の「ルート」レベルのコンポーネントがある場合、イベントバスは、すべてのVueインスタンスではなく、「ルート」レベルのコンポーネントとその子コンポーネントにインスタンス化する必要があります。vuejs2 - 単一ファイルコンポーネント階層のイベントバスを作成する方法

単純な$emit$onを使用することはできません。これは、階層が平文parent-childに限定されていないためです。したがって、イベントは複数のレベルに渡らなければなりません。

+0

親に戻したい場合は、 'this。$ parent。$ emit'を使用するか、' this。$ emit'を使用してコンポーネント上でイベントを直接聞くことができます。 –

+0

階層には複数のコンポーネントがあり、直接子 - >親通信が必要なだけではありません。私は質問を更新します。 – Johannes

答えて

5

あなたはeventBus.jsのようなJSファイルを作成し、ちょうどVUEのインスタンスをエクスポートすることができます。

import Vue from 'vue' 
const bus = new Vue() 
export default bus 

、あなたはあなたの.vueファイルにイベントバスをインポートすることができ

import bus from 'path/to/eventBus' 

... 

bus.$on('foo', ...) 

更新コメントの議論からの私の答え:

イベント名はstrなのでプレフィックス/名前空間をbus.$emit('domain.foo')bus.$emit('domain/foo')のようにイベントに追加することができます。

あなたのアプリケーションがますます複雑になると感じたら、ただvuexに行ってください。

+0

これを子コンポーネントでどのように使用しますか?バスをインポートすると、新しいインスタンスが作成されます。どうすればバスをコンポーネント階層にバインドすることができますか? – Johannes

+0

@Johannesいいえ、インスタンスは1回だけ作成されます。あなたのインポートされた 'bus'はすべて同じインスタンスです – CodinCat

+0

申し訳ありませんが、私はこれをかなり得ていません。 'eventBus.js'がインスタンスを一度しか作成しない場合、インスタンスを' Vue'プロトタイプにバインドするLinusBorgのソリューションを使うことの違いは何ですか?私ができることは、スコープの異なるバスを作成することです(グリッドコンポーネント用のスコープ付きバス、チャットコンポーネント用のバスなど) – Johannes

関連する問題