2015-04-29 227 views
2

訪問方法,我有收到孩子,使這些兒童對兒童

component = React.createClass({  
    ...some JSX 

    {this.props.children} 

    ...some JSX 
)} 

在某些時候,我需要各地的孩子們循環,並呼籲它們公開的方法的組成部分。但是,孩子不是對象實例,而是React表示。

在本質上我想要做這樣的事情:

var children = this.props.children 
React.Children.forEach(children, function(child) { 
    child.someAction() 
}) 

什麼是實現這一目標的最佳途徑?

我在IRC上遇到過一種方法,它涉及克隆孩子,然後通過參考來訪問他們。雖然看起來有些複雜。

// in JSX 
{ 
    newChildren = React.Children.map(children, function(child) { 
    return React.CloneElement(child, {ref: child.ref}) 
    }) 
} 

然後做

childRefs = this.props.children.map(function(child) { 
    return child.ref 
}) 

var self = this; 
childRefs.forEach(function(ref){ 
    self.refs[ref].someAction() 
}) 

雖然,這種感覺就像我的工作對反應。

+0

這是調用由父組件一些事件觸發,還是應該在孩子的一些點被稱爲組件的生命週期(例如渲染之前,渲染之後)? – Mark

+1

也許孩子們應該聽聽道具變化。在渲染孩子後,父母應該改變他們的道具,觸發他們的方法發射。 –

+0

@Mark我正在試圖找出一個父母在孩子身上調用方法的正確方法。 – BezR

回答

0

在Generel中,您應該始終嘗試使用外部進入方法並將數據視爲不可變的。

向所有兒童提供shouldValidate標誌作爲道具,然後讓所有孩子執行componentWillReceiveProps函數來進行驗證,這是我看到的首選方式。 組件應該在我看來從來沒有公開從外部調用的函數/屬性,因爲這違背了React的想法。

的JSX例如:

家長

render: function() { 
    return this.children.map(Child => { 
     return <Child shouldValidate={this.state.submitting}/> 
    }); 
} 

onSubmit: function() { 
    this.setState({ 
     submitting: true 
    }) 
} 

兒童

componentWillReceiveProps: (nextProps) => { 
    if (this.props.shouldValidate) { 
     validate(); 
    } 
} 
+0

我用這種方法看到的潛在問題是提交事件不依賴於驗證,所以即使驗證在組件級別失敗,表單也會提交。 – Mark

+0

@Hulvej這是一個我沒有想到的有趣的方法,但馬克有一個好點 - 直接調用.validate的好處的一部分是。如果輸入無效,則validate返回false,從而允許我跳出提交。 – BezR

+0

@mark你有一點。然而,這個例子僅僅證明了我關於組件依賴的觀點。 儘管如此,我認爲驗證樹是不必要的。您應該驗證您的數據,並且每個組件都不應該承擔此責任。如果日期有效,我會得到日期組件驗證的點。但是,如果你有一個說法的模型,一個日期+名稱和一個數字共同代表某種日期模型。父組件應該只是對整個模型進行驗證。讓我知道你是否需要我的意思的例子.. – Hulvej