2017-04-01 7 views
5

私はこれがうまくいくために苦労しています。 FormComponentからChooseLangComponentのselected値にアクセスする必要があります。これを行う直接的な方法はありますか、それとも親コンポーネント(中間の人間のような行為)から渡す必要がありますか?私はすでにChooseLangComponentの$emitとFormComponentのv-on:..を試しましたが、うまくいきませんでした。子コンポーネント間でデータを渡す

ChooseLangComponent:

<template lang="html"> 
    <div class="choose-lang"> 
     <select v-model="selected"> 
      <option v-for="lang in langs" v-bind:value="lang.value">{{lang.text}}</option> 
     </select> 
    </div> 
</template> 

<script> 
    export default { 
     data() { 
      return { 
       selected: 'en', 
       langs: [ 
        { text: 'English', value: 'en' }, 
        { text: 'German', value: 'ge' }, 
       ] 
      } 
     } 
    } 
</script> 

FormComponent:

<template lang="html"> 
    <div class="form-name"> 
     <div class="inputs"> 
      <input type="text" v-model="nameText" v-on:keyup.enter="send_name"> 
     </div> 
    </div> 
</template> 

export default { 
    data() { 
     return { 
      nameText: '', 
     } 
    }, 
    methods: { 
     send_name() { 
       // I need the selected language here 
     } 
    } 
} 

親コンポーネント:

<div id="app"> 
    <choose-lang></choose-lang> 
    ... 
    <form-comp></form-comp> 
</div> 

... 
Vue.component('choose-lang', require('./components/ChooseLangComponent.vue')); 
Vue.component('form-comp', require('./components/FormComponent.vue')); 

const app = new Vue({ 
el: '#app', 
data: { 
    ... 
}); 
+0

を確認してください選択した項目

const store = { data: { selected: null } } Vue.component('lang', { template: '#lang-tmp', data() { return { selected: 'en', langs: [ { text: 'English', value: 'en' }, { text: 'German', value: 'ge' }, ] } }, created() { this.changeLang() }, methods: { changeLang() { store.data.selected = this.selected } } }) Vue.component('frm', { template: '#frm-tmp', data() { return { storeSelected: store.data } } }) const app = new Vue({ el: '#app' }) 

http://jsbin.com/qagahabile/edit?html,js,output

の状態を保持するだろう平野オブジェクトをこのようなことはどうですか - http://jsbin.com/siyipuboki/edit?html,js,output –

答えて

7

2の簡単な方法とがあるオーケーあなたのアプリならば、Vuexを含み、1以上大規模です。

最初の方法はイベントバスを作成することです。イベントは1つのハブにイベントを送信してから、必要な場所にイベントをキャッチします。

const Bus = new Vue({}) 

Vue.component('lang', { 
     template: '#lang-tmp', 
     data() { 
      return { 
       selected: 'en', 
       langs: [ 
        { text: 'English', value: 'en' }, 
        { text: 'German', value: 'ge' }, 
       ] 
      } 
     }, 
     created() { 
      this.changeLang() 
     }, 
     methods: { 
      changeLang() { 
      Bus.$emit('langChanged', this.selected) 
      } 
     } 
}) 

Vue.component('frm', { 
    template: '#frm-tmp', 
    data() { 
    return { 
     selectedItem: 'en' 
    } 
    }, 
    created() { 
    Bus.$on('langChanged', (selected) => { 
     this.selectedItem = selected 
    }) 
    } 
}) 

const app = new Vue({ 

    el: '#app' 

}) 

http://jsbin.com/siyipuboki/edit?html,js,output

第二の方法は、店舗の一種作成された - また、このVueJS access child component's data from parent

+0

ありがとう、私は私のプロジェクトでそれをテストするとすぐにそれを受け入れます。私はあなたに+1をしたいと思いますが、あなたのためにあなたの人生を変えることはできません。 –

+0

最初の方法に問題があります。 「バスは定義されていません」、langComponent内のBusを参照します。私はapp.js上で 'const Bus = ...'と宣言しています。コンポーネントは別ファイルにあります(それでも問題があるかどうかわかりません)。 –

+0

申し訳ありませんが、jsbinはエラーなしで正常に動作します。 –

関連する問題