react組件之間的通訊

背景故事很簡單:
父組件對子組件傳遞信息,直接使用props即可;
子組建對父組件傳遞信息,參考自React 組件之間如何交流,讓子組件觸發(fā)

this.props.callbackParent(newState);

父組件進行對應(yīng)的設(shè)置:

 onChildChanged: function (newState) { 
    this.setState({ checked: newState }); 
},

并在render加入:

<ToggleButton text="Toggle me" 
initialChecked={this.state.checked} 
callbackParent={this.onChildChanged}
 />

這里ToggleButton就是對應(yīng)的子組件,看起來流程有些復(fù)雜。

那么獨立組件之間呢?據(jù)說flux可以解決這樣的問題,于是發(fā)現(xiàn)flux傻瓜教程,提到:
<blockquote>
如果你的應(yīng)用需要處理動態(tài)的數(shù)據(jù),那很可能需要使用 Flux。
如果只是一些靜態(tài)的視圖,它們之間不共享狀態(tài),你也沒什么數(shù)據(jù)保存或者更新,就不需要使用 Flux,用了也沒什么好處。
</blockquote>
當(dāng)然flux的單向數(shù)據(jù)流處理機制可以解決獨立組件的通信,但我的通訊需求沒那么多,并且把當(dāng)前代碼全部改寫為適用于flux的代碼也挺煩人的。有沒有輕量的辦法?有一個工具,叫做js-signals。
樣例十分明朗:

//custom object that dispatch a `started` signal
var myObject = {
  started : new signals.Signal()
};
function onStarted(param1, param2){
  alert(param1 + param2);
}
myObject.started.add(onStarted); //add listener
myObject.started.dispatch('foo', 'bar'); //dispatch signal passing custom parameters
myObject.started.remove(onStarted); //remove a single listener

對于兩個獨立組件,使用它的思路是:

  1. 建立一個全局組件,其中引入signals所需,并讓兩個組件都分別引入這個全局組件:
import Signals  from  'signals';
var Global = {
         broadData: new Signals.Signal(), //全局?jǐn)?shù)據(jù)廣播對象
         datas : {}  //總數(shù)據(jù)對象
};
module.exports = Global;
  1. 發(fā)送方在自己的某個事件中,先設(shè)置好要傳遞的數(shù)據(jù),然后調(diào)用dispatch:
 this.preValue = e.target.value ;
 Global.datas.curValue=this.preValue; //將curValue放入總數(shù)居對象
 Global.broadData.dispatch( Global.datas); //發(fā)布數(shù)據(jù)
  1. 接收方注冊一個響應(yīng)事件即可:
 getPer(){
                var that=this;
                console.log(Global.datas);
                Global.broadData.add(function(data){ //收聽到數(shù)據(jù)
                console.log('data'+data);
                   that.setState({
                      endValue:data.curValue,
                   });
                });
                
            }   

這里需要特別注意的是,該事件注冊一次就好了。我寫在了constructor里,其他合適的時機下也沒有問題:

 constructor(props) {
    super(props);
    this.state = {
      endValue: 0 ,
    };

   this.getPer();
  }

你通過代碼已經(jīng)注意到,如果有多個接收方,都是先照單全收,然后根據(jù)發(fā)來的數(shù)據(jù)其中的屬性“歸不歸自己管”來進行處理。這當(dāng)然不是最好的辦法,但輕度使用還是足夠。更多獨自組件的通訊方法請參見React 組件之間如何交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在 React 中,UI 以組件的形式來搭建,組件之間可以嵌套組合。另,React 中組件間通信的數(shù)據(jù)流是單向的,...
    魔仙堡下的老仙女閱讀 392評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,954評論 1 18
  • 目前,react組件有三種寫法,分別是es5的createClass寫法,es6的class寫法,以及statel...
    ZoomFunc閱讀 1,913評論 0 1
  • In this article we will discuss how to use Higher Order C...
    人頭原子彈閱讀 692評論 0 0

友情鏈接更多精彩內(nèi)容