Reactjs 将逻辑转化为新的行动

Reactjs 将逻辑转化为新的行动,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我有一些组件。此组件包含方法“componentWillReceiveProps”。 此方法大致包含以下逻辑: componentWillReceiveProps(nextProps) { if (this.props.someObject.obj1.prop1 != nextProps.someObject.obj1.prop1 || this.props.someObject.obj2.prop2 != nextProps.someObject.obj2.prop2) {

我有一些组件。此组件包含方法“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);     
    }
}
并修改组件WillReceiveProps:

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

因此,如果您希望将newAction和doAction1作为道具发送到组件,那么您所写的内容是正确的。 从您的代码来看,我认为将“newAction”定义为组件的函数可能更好。 只需在组件中定义并绑定它。应将其作为“this.newAction”调用 您还可以将其绑定到组件,如下所示:

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

因此,如果您希望将newAction和doAction1作为道具发送到组件,那么您所写的内容是正确的。 从您的代码来看,我认为将“newAction”定义为组件的函数可能更好。 只需在组件中定义并绑定它。应将其作为“this.newAction”调用 您还可以将其绑定到组件,如下所示:

newAction = (current, new)=>{
if (current.obj1.prop1 != new.obj1.prop1
  || current.obj2.prop2 != new.obj2.prop2) {
  doAction1(new);     
 }
}
  • 我认为您使用术语
    action
    的方式是错误的。行动应引起减速器的更新。不是一个组件逻辑,所以它应该是组件的一个方法,或者只是一个函数
  • 如果你真的是指动作——不要在componentWillReceiveProps中使用它(这是一个错误的模式)。在这种情况下,你有可能

    • 应用程序的递归更新
    • 混乱的状态逻辑
    • 不一致状态
  • 因此,如果您想在某些对象(通过reducer)发生更改时触发状态更新(调用reducer)——您最好在reducer中执行此操作(如果该对象在其他reducer中更新——您可以使用redux thunk/redux saga)。另外,最好对所有这些更改只调用一个操作,以确保状态的一致性

  • 摘要:

    操作应引发状态的原子更新。如果您正在编写大量不知道要更改的其他对象的简化程序,请使用
    redux-thunk
    redux-saga
    ,为简化程序准备数据并只调用一个操作,这应该在少数简化程序中使用

    不要将更新状态的逻辑移到组件中(这与使用MVC和从视图更新模型是一样的)

  • 我认为您使用术语
    action
    的方式是错误的。行动应引起减速器的更新。不是一个组件逻辑,所以它应该是组件的一个方法,或者只是一个函数
  • 如果你真的是指动作——不要在componentWillReceiveProps中使用它(这是一个错误的模式)。在这种情况下,你有可能

    • 应用程序的递归更新
    • 混乱的状态逻辑
    • 不一致状态
  • 因此,如果您想在某些对象(通过reducer)发生更改时触发状态更新(调用reducer)——您最好在reducer中执行此操作(如果该对象在其他reducer中更新——您可以使用redux thunk/redux saga)。另外,最好对所有这些更改只调用一个操作,以确保状态的一致性

  • 摘要:

    操作应引发状态的原子更新。如果您正在编写大量不知道要更改的其他对象的简化程序,请使用
    redux-thunk
    redux-saga
    ,为简化程序准备数据并只调用一个操作,这应该在少数简化程序中使用


    不要将更新状态的逻辑移动到组件中(这与您使用MVC并从视图更新模型是一样的)。

    如果
    doAction1
    是redux操作的创建者,您如果不使用
    调度来包装它,就不能调用它。直接调用
    doAction1(…)
    不会触发减速机

    大概您已经使用
    mapDispatchToProps
    接收
    doAction1
    作为组件的道具,因此可以这样调用它:
    this.props.doAction1(…)
    。也就是说,
    this.props.doAction1
    本质上是一个
    dispatch
    wrapped
    doAction1

    因此,如果我的理解是正确的,那么你想要这样的东西:

    newAction = (current, new)=>{
    if (current.obj1.prop1 != new.obj1.prop1
      || current.obj2.prop2 != new.obj2.prop2) {
      doAction1(new);     
     }
    }
    
    一种方法,用于进行比较并将您的操作作为回调进行分派

    // 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操作生成器中,函数
      返回带有
      类型
      键的对象。
      类型是目标减速器
    • 要触发目标reducer,在调用action creator时,应该使用分派包装它

    如果
    doAction1
    是redux action创建者,则如果不使用
    dispatch
    将其包装,则无法调用它。直接调用
    doAction1(…)
    不会触发减速机

    大概您已经使用
    mapDispatchToProps
    接收
    doAction1
    作为组件的道具,因此可以这样调用它:
    this.props.doAction1(…)
    。也就是说,
    this.props.doAction1
    本质上是一个
    dispatch
    wrapped
    doAction1

    因此,如果我的理解是正确的,那么你想要这样的东西:

    newAction = (current, new)=>{
    if (current.obj1.prop1 != new.obj1.prop1
      || current.obj2.prop2 != new.obj2.prop2) {
      doAction1(new);     
     }
    }
    
    一种方法,用于进行比较并将您的操作作为回调进行分派

    // 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操作生成器中,函数
      返回带有
      类型
      键的对象。
      类型是目标减速器
    • 要触发目标reducer,在调用action creator时,应该使用分派包装它