2016-04-03 32 views
0

在Angular中,我們可以使用$ scope。$ emit方法來通知祖先。我們如何在React中做同樣的事情?

+0

您是否試圖觸發某個生命週期事件或屬於某個祖先類的函數? – Noitidart

+0

是的。想象一下,我有一個很深的觀點樹。在一個葉節點中有一個按鈕,單擊此按鈕時,我需要根視圖切換到新視圖。 – Pylipala

+0

我不認爲有這樣的事情發射。 React是一種非常不同的思考方式。國家應該通過這些祖先,直到它到達按鈕。所以在那個控制視圖的祖先中,它會看到一個新的狀態並切換視圖。這是我的想法。 – Noitidart

回答

0

這個簡單的解決方案是將回調從父對象傳遞給子對象,等等......當下降調用回調時,它將在父對象的上下文中運行。

class Parent extends React.Component { 
 
    constructor() { 
 
    this.click = this.click.bind(this); // bind the handler to this 
 
    } 
 
    
 
    click(view) { 
 
    this.setState({ view }); // change the state 
 
    } 
 
    
 
    render() { 
 
    return <Child clickHandler={ this.click } />; // pass CB to child 
 
    } 
 
} 
 

 
class Child extends React.Component { 
 
    render() { 
 
    return <GrandChild clickHandler={ this.props.clickHandler } />; // pass CB to grandChild 
 
    } 
 
} 
 

 
class GrandChild extends React.Component { 
 
    render() { 
 
    return <button onClick={() => this.props.clickHandler('nextViewId') }>Click</button>; // invoke CB on click 
 
    } 
 
}

的問題是,如果你有一個大的樹組成部分,你將不得不多回調轉移到多個級別。這意味着每個容器可以有多個屬性,只是通過CBs,使測試和維護非常困難。針對小應用使用此解決方案。

對於大型應用程序,您應該使用基於Flux的體系結構,例如redux。大概的想法是,每個動作都由調用組件調度,並由主存儲庫處理,這會創建一個新模型,並將其傳遞到組件樹的根目錄。這樣,每個組件都可以獲取所需的所有數據,並且可以根據需要處理它。這會感覺有點像使用Angular的$廣播到根。

相關問題