2016-12-02 76 views
0

我有一些組件。該組件包含方法「componentWillReceiveProps」。 該方法大致包含的邏輯:將邏輯轉換爲新動作

componentWillReceiveProps(nextProps) { 
    if (this.props.someObject.obj1.prop1 != nextProps.someObject.obj1.prop1 
     || this.props.someObject.obj2.prop2 != nextProps.someObject.obj2.prop2) { 
     this.props.doAction1(nextProps.someObject);  
    } 
    //any code 
    } 

的 「this.props.doAction1」 - 是動作。

如果我創建新動作並將此邏輯轉換爲新動作,可以嗎?

例如:

function newAction(current, new){ 
    if (current.obj1.prop1 != new.obj1.prop1 
     || current.obj2.prop2 != new.obj2.prop2) { 
     doAction1(new);  
    } 
} 

並修改componentWillReceiveProps:

componentWillReceiveProps(nextProps) {  
    this.props.newAction(this.props.someObject, nextProps.someObject); 
    //any code 
    } 

回答

1

如果doAction1是終極版行動的創建者,你不能調用它沒有與dispatch加以包裝。直接調用doAction1(...)不會觸發您的減速器。

想必您已使用mapDispatchToProps來接收doAction1作爲您的組件的道具,因此可以像這樣調用它:this.props.doAction1(...)。也就是說,this.props.doAction1本質上是dispatch包裝doAction1

所以,如果我的理解是正確的,你想是這樣的:

做比較和dipatch你這種行爲是回調

// the 'newAction' method 
function checkAndDispatch(current, new, callback){ 
    if (current.obj1.prop1 != new.obj1.prop1 
    || current.obj2.prop2 != new.obj2.prop2) { 
    callback(new);  
    } 
} 

和你的組件中的方法:

componentWillReceiveProps(nextProps) {  
    checkAndDispatch(this.props.someObject, nextProps.someObject, this.props.doAction1); 
    // ... 
} 

要點思考:

  • 在Redux的作用是創建者,其功能與return一個type鍵的對象。 type是目標減速器。
  • 要觸發目標縮減器,動作創建者在調用時應該使用調度包裝。
1

,如果你想同時發送newAction和doAction1作爲道具的組件,以便你寫什麼是正確的。 從你的代碼中,我認爲如果你定義'newAction'作爲你的組件的函數可能會更好。 只需在組件中定義它並將其綁定即可。應當援引爲「this.newAction」 您也可以將其綁定到您的組件是這樣的:

newAction = (current, new)=>{ 
if (current.obj1.prop1 != new.obj1.prop1 
    || current.obj2.prop2 != new.obj2.prop2) { 
    doAction1(new);  
} 
} 
1
  1. 我認爲你是在一個錯誤的方式使用期限action。行動應該引起減員的更新。不是組件邏輯,所以它應該是組件的一個方法,或者只是一個功能,如果你想。
  2. 如果你確實是在採取行動 - 不要在componentWillReceiveProps中使用它(這是完全錯誤的模式)。在這種情況下,你冒着讓

    • 應用的遞歸更新
    • 在狀態邏輯
    • 不一致的狀態
  3. 所以,如果你是想激怒狀態更新(調用reducer)如果某些對象已被更改(通過reducer) - 最好在reducer中執行它(如果該對象在其他reducer中更新 - 可以使用redux-thunk/redux-saga)。另外,最好只對所有這些更改調用一個動作,以確保狀態的一致性。

摘要:

行動應挑起狀態原子更新。如果您編寫了許多不知道要更改的其他對象的減速器 - 請使用redux-thunkredux-saga,爲減速器準備數據並只調用一個動作,這些動作應在少數減速器中使用。

不要將更新狀態的邏輯移動到組件中(這與使用MVC並從視圖更新模型相同)。

相關問題