在兒童 - 父母關係中組件之間共享數據的過程已有詳細記錄,並且可以直接在React文檔中處理。不太明顯的是如何共享不共享父子關係的組件之間的狀態和任意數據。 Flux作爲一種解決方案提供,過去我已經推出了自己的pub/sub系統,但在這個領域仍然存在着reactjs開發人員之間的巨大分歧。 RxJS已經作爲一個解決方案提供,並且在觀察者模式上提供了許多變體,但是我想知道是否有更加規範的方式來管理這個問題,特別是在組件不太緊密的大型應用程序中。如何在非父母子女反應組件之間共享數據?
1
A
回答
1
我的解決方案通常是將回調作爲道具傳遞給將接受用戶輸入的組件。該回調會執行父項中的狀態更改,該更改會向下傳播。例如:
UI = React.createClass({
getInitialState() {
return {
text: ""
};
}
hello(text) {
this.setState({
text: text
});
}
render() {
return (
<div>
<TextView content={this.state.text}>
<Button onclick={() => this.hello("HELLO WORLD")}>
</div>
);
}
});
// TextView and Button are left as an exercise to the reader
我喜歡這個,因爲每個家長成分仍然是唯一負責其內容和子組件不侵入知道對方的任何事情;這都是回調。不可否認,大規模的反應的應用程序,但我喜歡沒有一個全球事件調度管理一切,使控制流很難遵循。在本例中,UI
類將始終是完全自包含的,並且可以根據需要進行復制,而不存在名稱重用的風險。
編輯:
下面是示出部件之間的更直接的關係的例子。它基本上是一樣的,因爲父母仍然必須促進這種關係。我更喜歡前面的例子,因爲我更喜歡帶有道具的小零件,而不是任何可能的狀態。
UI = React.createClass({
render() {
textView = <TextView>;
return (
<div>
{textView}
<Button onclick={() => textView.setText("HELLO WORLD")}>
</div>
);
}
});
// TextView and Button are left as an exercise to the reader.
// TextView is presumed to have a setText method, which internally calls
// this.setState(...)
相關問題
- 1. 父母與子女之間的資源共享流程
- 2. 反應組件 - 父母子女互動;組件生命週期
- 3. 如何在兩個子Angular2組件之間共享父HTML?
- 4. 父子組分反應的(共享)
- 5. 我如何在Vue中的父子組件之間共享數據
- 6. 父母與子女之間的溝通
- 7. 父母與子女SWF之間的分享類
- 8. Angular2在組件之間共享數據
- 9. 在Angularjs組件之間共享數據
- 10. 餘燼數據:父母/子女之間的關係
- 11. 休眠JPA父母與子組合違反父子女
- 12. 如何在組件之間共享ContextMenu
- 13. 父母和子女關係數組
- 14. PHP分層數組 - 父母和子女
- 15. 與共享父母和子女繪製整潔的圖形
- 16. 在子組件之間共享類成員數據
- 17. LINQ的反轉父母子女序列
- 18. 透明父母的非透明子女
- 19. 將子女分配給父母之一的父母之一
- 20. vue 2父母獲取子女組件數據
- 21. Angular2 - 如何在組件之間共享數據/更改
- 22. 如何在類之間共享數據?
- 23. 如何在iPhone之間共享數據?
- 24. Angular 2 Dart:如何在父路由器和子組件之間共享變量?
- 25. 如何通過祖父母組件中的「子女」動態定義父母/子女組成部分之間的通信?
- 26. linq:祖父母 - 父母 - 子女查詢
- 27. 使用一個管道在父母和子女之間讀寫
- 28. 在JSP文件之間共享數據?
- 29. 在Javascript文件之間共享數據
- 30. 如何在兩個反應組件之間建立共享狀態?
這是不是還不是親子關係?如果有兩個'''UI'''''「父母」組件,都意味着保持同步,都與他們自己的孩子?你能否更新你的例子? – sjt003
@ sjt003好了,在這個例子中,它是有關係的Button和TextView。父母的工作是建立和促進這種關係。在你的例子中,如果你有兩個需要通信的UI組件,你可以把它們放在一個設置通信的父項下。 我已經更新了與Button和TextView有更直接的關係的示例 - Button接收直接調用TextView的setText方法的回調。但是,我通常會發現,儘可能將圖上的狀態提高一些,道具較低。 – Lucretiel
@ sjt003我的哲學談到React的時候,一切可見都應該用道具和狀態來管理。如果兩個遙遠的組件共享一些狀態並需要保持同步,那麼該狀態應該存在於其父節點中。大多數React應用程序都有一個頂級父組件,可以在該狀態下運行。你可以用一個例子來更新你的問題:一個例子中兩個組件完全獨立,而且它們不在單個父代之下? – Lucretiel