2015-12-30 93 views
39

我很努力地理解如何在vue.js中的組件之間傳遞數據。我已經多次閱讀文檔並查看了許多與vue相關的問題和教程,但我仍然沒有得到它。將數據傳遞給vue.js中的組件

要總結我解決這個頭,我希望幫助完成一個非常簡單的例子

  1. 顯示用戶的列表中一個組件(完成)
  2. 用戶數據發送到一個新的組件時,點擊鏈接(完成) - 請參閱底部的更新。
  3. 編輯用戶數據,併發送回原來的組件(還沒有得到這一步)

這裏是一個小提琴,從而未能在步驟二:https://jsfiddle.net/retrogradeMT/d1a8hps0/

我明白,我需要使用道具將數據傳遞給新組件,但我不確定如何在功能上做到這一點。我如何將數據綁定到新組件?

HTML:

<div id="page-content"> 
     <router-view></router-view> 
    </div> 

<template id="userBlock" > 
    <ul> 
    <li v-for="user in users">{{user.name}} - <a v-link="{ path: '/new' }"> Show new component</a> 
    </li> 
    </ul> 
</template> 

    <template id="newtemp" :name ="{{user.name}}"> 
    <form> 
     <label>Name: </label><input v-model="name"> 
     <input type="submit" value="Submit"> 
    </form> 
    </template> 

JS爲主要成分:

Vue.component('app-page', { 
    template: '#userBlock', 

    data: function() { 
    return{ 

     users: [] 
     } 
    }, 

ready: function() { 
    this.fetchUsers(); 
}, 

methods: { 
    fetchUsers: function(){ 
     var users = [ 
      { 
      id: 1, 
      name: 'tom' 
      }, 
      { 
      id: 2, 
      name: 'brian' 
      }, 
      { 
      id: 3, 
      name: 'sam' 
      }, 
     ]; 

     this.$set('users', users); 
    } 
    } 
    }) 

JS爲第二組分:

Vue.component('newtemp', { 
    template: '#newtemp', 
    props: 'name', 
    data: function() { 
    return { 
     name: name, 
     } 
    }, 
}) 

UPDATE

好的,我已經弄清楚了第二步。這裏是一個新的小提琴展示進展:https://jsfiddle.net/retrogradeMT/9pffnmjp/

因爲我使用Vue路由器,我不使用道具發送數據到一個新的組件。相反,我需要在v-link上設置參數,然後使用轉換鉤來接受它。

V-LINK改變see named routes in vue-router docs

<a v-link="{ name: 'new', params: { name: user.name }}"> Show new component</a> 

然後在組件上,將數據添加到路由選項see transition hooks

Vue.component('newtemp', { 
    template: '#newtemp', 
    route: { 
    data: function(transition) { 
     transition.next({ 
      // saving the id which is passed in url 
      name: transition.to.params.name 
     }); 
    } 
    }, 
data: function() { 
    return { 
     name:name, 
     } 
    }, 
}) 

回答

26

-------------繼才Vue公司是適用1點--------------

傳遞的數據可以通過多種方式來完成。該方法取決於使用的類型。


如果您想在添加新組件時從您的html傳遞數據。這是使用道具完成的。只有當你添加道具名稱prop-nameprops屬性

<my-component prop-name="value"></my-component> 

此道具值將提供給您的組件。


當數據由於某些動態或靜態事件而從組件傳遞到另一個組件時。這是通過使用事件調度員和廣播員完成的。因此,舉例來說,如果你有一個組件結構是這樣的:

<my-parent> 
    <my-child-A></my-child-A> 
    <my-child-B></my-child-B> 
</my-parent> 

而且要從<my-child-A>數據發送到<my-child-B>然後<my-child-A>你將不得不分派事件:

this.$dispatch('event_name', data); 

此事件一路走上母鏈。從任何一位家長你有一個分支<my-child-B>您隨着數據廣播事件。所以在父母:

events:{ 
    'event_name' : function(data){ 
     this.$broadcast('event_name', data); 
    }, 

現在這個廣播將沿着兒童鏈。而在任何一個孩子,你要搶的情況下,在我們的例子<my-child-B>我們將添加另一個事件:

events: { 
    'event_name' : function(data){ 
     // Your code. 
    }, 
}, 

第三種方式來傳遞數據是通過V-鏈接參數。當組件鏈被完全銷燬或者當URI改變時,這個方法被使用。我可以看到你已經瞭解他們。


決定您想要什麼類型的數據通信,並進行適當的選擇。

+0

謝謝,這真的很有幫助。唯一我仍在努力的是命名約定。即:我有通過v鏈接作爲名稱傳遞的user.name。我現在可以編輯名稱變量並將其作爲名稱傳回原始組件,但原始組件沒有名爲var的變量。我在這裏錯過了什麼?不可能通過v-link傳遞一個對象? – retrograde

+0

您已經傳遞了一個對象。 「params」是一個對象。名稱密鑰可以分配給組件中的this.user.name。如果你需要幫助,創建一個小提琴,並讓我知道。檢查了這一點:http://vuejs.github.io/vue-router/en/route.html – notANerdDev

+0

啊,好吧,我已經得到它。再次感謝。我感謝你的幫助,它讓事情變得更加清晰。 – retrograde

8

我認爲這個問題是在這裏:

<template id="newtemp" :name ="{{user.name}}"> 

當你用:作爲道具的前綴時,你是指示對Vue說,它是一個變量,而不是一個字符串。所以你不需要{{}}user.name。嘗試:

<template id="newtemp" :name ="user.name"> 

編輯-----

以上是真實的,但這裏的更大的問題是,當你更改URL,去一個新的路線,原來的分量消失。爲了讓第二個組件編輯父數據,第二個組件需要是第一個組件的子組件,或者只是同一個組件的一部分。

+0

謝謝傑夫。我試圖刪除{{}},但我仍然得到相同的錯誤。 – retrograde

2

我發現一種方法可以將父數據傳遞給Vue中的組件範圍,我認爲這有點破解,但也許這會幫助你。作爲外部對象在Vue的實例

1)參考的數據(數據:dataObj)

2)然後在子組件中的數據返回功能只是返回parentScope = dataObj瞧。現在你不能做像{{parentScope.prop}}這樣的事情,並且會像魅力一樣工作。

祝你好運!

+0

這就是說,將兩個組件連接在一起對樹和它的節點可以是可以的,但通常不受歡迎。 我會盡量避免這種情況。 – dec

0

將數據從父組件發送給孩子的最佳方式是使用props

經由props

  • 從父傳遞數據到子聲明props在子(陣列或object
  • 經由<child :name="variableOnParent">

它傳遞給孩子觀看演示下面:

Vue.component('child-comp', { 
 
    props: ['message'], // declare the props 
 
    template: '<p>At child-comp, using props in the template: {{ message }}</p>', 
 
    mounted: function() { 
 
    console.log('The props are also available in JS:', this.message); 
 
    } 
 
}) 
 

 
new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    variableAtParent: 'DATA FROM PARENT!' 
 
    } 
 
})
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script> 
 

 
<div id="app"> 
 
    <p>At Parent: {{ variableAtParent }}</p> 
 
    <child-comp :message="variableAtParent"></child-comp> 
 
</div>