2017-08-23 30 views
1

おそらく現在はおそらく過剰な状態であるため、vuexを状態管理に使用したくないでしょう。 私はhttps://vuejs.org/v2/guide/components.html#Non-Parent-Child-Communicationを見ました。私は単一のファイルコンポーネントを使用しているので、どちらのコンポーネントにも共有バスがどこに定義されているのかはわかりません。兄弟コンポーネント間のVue共有状態

var bus = new Vue() 

ChildA.Vue

watch: { 
    sideNav: (newValue) => { 
    bus.$emit('sideNav-changed', newValue) 
    } 
} 

ChildB.Vue

created() { 
    bus.$on('sideNav-changed', data => { 
    console.log(`received new value: ${data}`) 
    // update own copy here 
    }) 
} 

Parent.Vue

<template> 
    <childA> 
    </childA> 
    <childB> 
    </childB> 
</template> 

私はsideNavの変更をChildAで監視し、それをChildBに送信して独自の値を更新したいと考えています。それに対する答えを見つけ

答えて

1

...

私はmain.js

const bus = new Vue() // Single event hub 

// Distribute to components using global mixin 
Vue.mixin({ 
    data: function() { 
    return { 
     bus : bus 
    } 
    } 
}) 

にそれを宣言し、また

watch: { 
    sideNav: function (newValue) { 
    bus.$emit('sideNav-changed', newValue) 
    } 
} 
+1

この場合、スニペットは「変更」されます。あなたは 'this.bus。$ emit'を意味しましたか? – dfsq

+0

ああ、それだけでなく、機能の宣言に気づいてください。彼らは同じではありません –

+0

私は彼らが同じではないことを知っていますが、あなたは 'this'を使用していないようだからあなたのケースでは同等です。 – dfsq

0

watch: { 
    sideNav: (newValue) => { 
    bus.$emit('sideNav-changed', newValue) 
    } 
} 

を変更ですthis answerあなたに良いことはありますか?イベントですべてを行うことはできますが、それらを避けることができれば、そうすべきです。あなたは現在vuexを望んでいないかもしれません。それが私の居場所です。しかし、最初からグローバルスコープの店舗とリアクティブパイプが必要です。ページ上の要素とストア内の項目との関係を「宣言」し、次にbastaとします。 Vueは残りの世話をします。あなたはイベントを気にしません。

0

だけのウィンドウにそれを添付することですこれを実行する最も簡単な方法、すなわち次に

window.bus = new Vue() 

それは、例えばグローバルミックスインを定義する必要なしに、あなたのすべてのコンポーネントで利用できるようになりますこれでも動作します:

watch: { 
    sideNav(newValue) { 
    bus.$emit('sideNav-changed', newValue) 
    } 
} 

希望します。

関連する問題