2017-09-29 10 views
3

これは実践の詳細ですが、私は実際に動作するシナリオを持っていませんが、私は例を挙げることができます。 Facebookのメッセンジャーを想像してみてください。ヘッダにチャットウィジェットがあり、メッセージをすばやく表示して返信することができます。また、[すべて表示]をクリックすると、メッセージページに移動できます。Vuejsは変数と関数を共有する複数のコンポーネントを持っています

私には2つのVueコンポーネントがあることがわかります。親コンポーネントと子コンポーネントは、すべてのページとメッセージページで使用されるため、より兄弟です。今

<chat></chat> and <chat-widget></chat-widget> 

私が見ることができるものから、ウィジェットとチャットウィンドウ自体渡って同じように動作する機能は、おそらく彼らはストレートのためにそれらがロードされている場所で、わずかに異なるテンプレートを持っていますが、代よさバットは次のようになります。私は私のVueのフロントエンドと私のバックエンド(データベース)との間に要求を送信するためにaxiosを使用することになり、私のバックエンドとしてLaravelを使用するよう

messages() {} 
compose() {} 
validate() {} 

これらはほんの一部の例です。

理想的には、これらのコンポーネントの機能を複製したくないので、単にそれらを複製するか、何らかの親関数を保存する方法がありますか?

1つの問題は、非同期のajaxリクエストのためです。私が単にバインドするメッセージを返す関数を呼び出すことはできません。少なくとも、私はできないと思います。

コンポーネント内で同じ機能を複製していないように、Vueでこれを最もうまくやる方法についてのガイダンスを探してください。

+0

多くのメッセージコンポーネントを持つコンテナ/リストコンポーネントを作成する必要があります。 – LakiGeri

+0

私はそれがどのように動作するかを視覚化できません。私は、このコンポーネントがメッセージとメッセージ関数と他のコンポーネントがそれらの関数と変数を直接使用していると言っているとあなたは言うでしょうか?どうすればいいのか分かりません。 – seb14717

答えて

1

あなたは、他のコンポーネントが拡張することができ、そこから、「ベース/アブストラクト」コンポーネントを作成するために組成物を使用することができます。

https://vuejs.org/v2/api/#extends

var CompA = { ... } 
// extend CompA without having to call `Vue.extend` on either 
var CompB = { 
    extends: CompA, 
    ... 
} 

をあなたは「ベース/抽象」クラスから機能を継承することができ、または親の機能の一部を無効にする。あなたができる

もう一つは、ミックスインを作成することです:

https://vuejs.org/v2/guide/mixins.html#ad

あなたのコンポーネントが機能を共有する必要がありますが、大部分は同じではありません場合、これは便利です。そのような場合にextendを使用する場合は、その場合には基本機能の大部分を上書きする方がよいでしょう。

もちろん、一般的に使用されているメソッドを別のファイルに抽出してコンポーネントに直接インポートすることはできません。

+0

申し訳ありません、mixinsは本当にいいですね。だから、私はそれを.jsファイルに入れ、var mixinName {}をエクスポートしてインポートすることができますか?また、私は私がデータを作成し、this.messagesのようにすることができる素晴らしいことができる素晴らしい機能を呼び出すことができます参照してください! – seb14717

+1

はい、説明したのと同じようにインポートすることができます。ミックスインの機能はコンポーネントの機能とマージされます。'data'とVueコンポーネントが提供するその他のオプションも設定できます。ドキュメントから:' mixinオブジェクトは任意のコンポーネントオプションを含むことができます '。 –

+0

好奇心、もし私がmixinを使用するか、または拡張する3つのコンポーネントがあるとすれば。それを各コンポーネントにインポートするか、グローバルに利用できるようにする必要がありますか? – seb14717

関連する問題