0
在Angular中,我們可以使用$ scope。$ emit方法來通知祖先。我們如何在React中做同樣的事情?
在Angular中,我們可以使用$ scope。$ emit方法來通知祖先。我們如何在React中做同樣的事情?
這個簡單的解決方案是將回調從父對象傳遞給子對象,等等......當下降調用回調時,它將在父對象的上下文中運行。
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的$廣播到根。
您是否試圖觸發某個生命週期事件或屬於某個祖先類的函數? – Noitidart
是的。想象一下,我有一個很深的觀點樹。在一個葉節點中有一個按鈕,單擊此按鈕時,我需要根視圖切換到新視圖。 – Pylipala
我不認爲有這樣的事情發射。 React是一種非常不同的思考方式。國家應該通過這些祖先,直到它到達按鈕。所以在那個控制視圖的祖先中,它會看到一個新的狀態並切換視圖。這是我的想法。 – Noitidart