2015-11-23 40 views
0

我有一個react.js組件,它具有帶onChange事件處理程序的select。我在需要向onChange添加特定行爲的父組件中重用該組件,但只有在滿足某些條件時才使用該組件。如果不是,則應適用子組件的行爲。這種情況僞會是這樣的:react.js中的事件組合

var ParentComponent = React.createClass({ 
    handleChange: function(event) { 
     if (condition_on_event) { 
      do_something_and_stop_the_handler(); 
     } else { 
      //execute_child_handler 
     } 
    }, 
    render: function() { 
     ... 
     <ChildComponent /> 
    } 

}); 

var ChildComponent = React.createClass({ 
    handleChange: function(event) { 
      //child handler code 
     } 
    }, 
    render: function() { 
     ... 
     <select onChange={this.handleChange} /> 
    } 

}); 

的想法是,母公司將根據選擇的子對象中的值執行的東西。但是隻有一個值,其餘的值通常會執行子處理程序。

在這種情況下,如果我將父處理程序作爲道具傳遞,它會覆蓋子處理程序,所以我需要在父項上覆制代碼。

想到的一個解決方案是,我可以將處理程序作爲具有不同名稱的通道傳遞,以便在子處理程序中使用它,但它看起來像一個非常骯髒的解決方案,因爲我添加了不必要的道具在孤立地使用時給孩子。

任何提示?

+0

傳遞一個道具給孩子似乎是一個合適的解決方案給我。沒有必要給它一個不同的名字。 –

+0

@FelixKling但是,那麼我怎樣才能組成這兩個處理程序的行爲呢? – antonienko

+0

哦,我只是注意到,你想有條件地執行取決於事件。 MMH。 –

回答

0

由於父組件似乎已經有種知道孩子在做什麼(即它知道有一些標準的事件處理邏輯的孩子),如何建立孩子和家長之間更強的合同嗎?

父母可以將回調傳遞給更改時調用的孩子。如果該回調返回除false之外的任何內容,則該孩子將繼續其通常的事件處理,否則將停止。

例子:

var ParentComponent = React.createClass({ 
    handleChange: function(event) { 
     if (!condition_on_event) { 
      return false; 
     } 
     do_something_and_stop_the_handler(); 
    }, 
    render: function() { 
     ... 
     <ChildComponent onChange={this.handleChange}/> 
    } 

}); 

var ChildComponent = React.createClass({ 
    handleChange: function(event) { 
     if (this.props.onChange && this.props.onChange(event) !== false) { 
     //child handler code 
     } 
    }, 
    render: function() { 
     ... 
     <select onChange={this.handleChange} /> 
    } 

}); 
+0

這是對我來說似乎「髒」的想法,因爲它的合同在兩方面都得到加強(不僅父母知道孩子,孩子也被修改)。 所以這就是我將要實施的解決方案,如果我沒有找到更優雅的東西。 謝謝! – antonienko

+0

是的,這並不理想。但是,您必須以任何方式更換小孩,否則應該如何通知家長更改事件? –

+0

好吧,我是reactjs的新手,所以我仍然在搞清楚整個事情是如何工作的:) – antonienko