2016-11-16 122 views
4

對於VueJS 2.0項目我見父組件

<template> 
<child></child> 
<button @click="$emit('childEvent)"></button> 
</template> 

的子組件上下面我:

{ 
    events: { 'childEvent' : function(){.... }, 
    ready() { this.$on('childEvent',...) }, 
    methods: { childEvent() {....} } 
} 

似乎沒有任何工作的按鈕點擊。是否需要創建一個父方法,然後發送給孩子?我正在使用vuejs 1,但現在我對父母對孩子溝通工作的方式感到困惑

回答

1

從父母到孩子的活動都是在Vue 1.0中使用$broadcast()完成的,在Vue 2.0中完全不可能。

你可能不需要這樣,通常有比不需要事件更好的解決方案,但這取決於你的用例。

+2

f我剛剛讀了什麼, –

+0

糾正了我的手機的自動糾錯意外。更好? –

+0

Woa。這個傢伙Linus Borg就像是Vue的核心貢獻者。他應該知道他在說什麼:D –

9

與參數的documentation

在Vue.js,親子組件關係可以概括爲道具下來,活動了。父母通過道具將數據傳遞給孩子,孩子通過事件向父母發送消息。我們來看看他們接下來的工作。

enter image description here

所以在最新的Vue公司,你不能從父事件發送到孩子,你可以通過道具來的孩子,從孩子送到事件父。

+0

您仍然可以使用$ root在'vue.js2'中發送從父母到父母的事件,但不推薦。 – madeye

12

雖然其他答案是正確的,並且通常可以使用數據驅動的方法。

我打算爲任何尋找這個問題的人回答這個問題,誰需要一種道具以外的方式。在嘗試將焦點放在自定義表單組件內的特定輸入時,遇到了類似的問題。要做到這一點,我不得不給自定義組件ref然後做到這一點。

this.$refs.customInput.$emit('focus'); 
//or 
this.$refs.customInput.directlyCallMethod(); 

這將訪問孩子的vue實例,然後您可以發出該組件聽到的事件。

+0

這看起來像一個整潔的解決方案。我沒有看到任何理由,爲什麼這不應該是標準做法。 – Teddy

+0

@Teddy它不是[Flux](https://vuejs.org/v2/guide/state-management.html),它是由Vue和React推薦的狀態管理體系結構。濫用它可能會導致回調意大利麪條。 –

5

你可以使用一個自定義的Vue實例。

// Globally 
const eventBus = new Vue() 

// In your child 
eventBus.$on('eventName',() => { 
    // Do something 
}); 

// In your parent 
eventBus.$emit('eventName') 
+1

這可以工作,我已經明確地在其他上下文中使用了總線方法(當組件坐在並排,而不是父子關係時),但是污染全局命名空間往往是一個壞主意,尤其是如果使用vanilla JS 。 –