2017-04-01 25 views
5

Tôi đang vật lộn vì điều này để hoạt động. Tôi cần truy cập giá trị selected trong phần tử SelectLangComponent từ FormComponent. Có cách nào trực tiếp để làm điều này hay chúng ta phải vượt qua nó từ thành phần cha mẹ (hành động như người trung gian)? Tôi đã thử với $emit trên ChooseLangComponent và v-on:.. trên FormComponent nhưng không hoạt động.Truyền dữ liệu giữa các thành phần con

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 
     } 
    } 
} 

Các thành phần cha mẹ:

<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

Thế còn cái gì như thế này - http://jsbin.com/siyipuboki/edit?html,js,output –

Trả lời

7

rồi có 2 cách dễ dàng và thêm một mà liên quan đến việc Vuex, nếu ứng dụng của bạn có quy mô lớn.

Cách đầu tiên là tạo Bus sự kiện - ý tưởng đang phát ra Sự kiện trong một trung tâm và sau đó bắt chúng ở nơi Cần.

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

cách thứ hai là tạo ra loại cửa hàng - đối tượng rõ ràng rằng sẽ tổ chức nhà nước của sản phẩm được chọn

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

Ngoài ra hãy kiểm tra này VueJS access child component's data from parent

+0

Cảm ơn bạn, tôi sẽ chấp nhận nó ngay sau khi tôi thử nghiệm nó trên dự án của tôi. Tôi muốn cung cấp cho bạn +1, nhưng không thể vì repu ... –

+0

Có vấn đề với phương pháp đầu tiên. 'Bus không được định nghĩa', tham chiếu đến Bus trong langComponent. Tôi đang khai báo 'const Bus = ...' trên app.js, và các thành phần nằm trên tập tin riêng biệt (không biết nếu đó là vấn đề) –

+0

Xin lỗi tôi không hiểu, jsbin hoạt động đúng mà không có bất kỳ lỗi nào. –

Các vấn đề liên quan