2016-12-02 55 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并从视图更新模型相同)。

相关问题