Reactjs 将逻辑转化为新的行动
我有一些组件。此组件包含方法“componentWillReceiveProps”。 此方法大致包含以下逻辑: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(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
的方式是错误的。行动应引起减速器的更新。不是一个组件逻辑,所以它应该是组件的一个方法,或者只是一个函数- 应用程序的递归更新
- 混乱的状态逻辑
- 不一致状态
redux-thunk
或redux-saga
,为简化程序准备数据并只调用一个操作,这应该在少数简化程序中使用
不要将更新状态的逻辑移到组件中(这与使用MVC和从视图更新模型是一样的)
action
的方式是错误的。行动应引起减速器的更新。不是一个组件逻辑,所以它应该是组件的一个方法,或者只是一个函数- 应用程序的递归更新
- 混乱的状态逻辑
- 不一致状态
redux-thunk
或redux-saga
,为简化程序准备数据并只调用一个操作,这应该在少数简化程序中使用
不要将更新状态的逻辑移动到组件中(这与您使用MVC并从视图更新模型是一样的)。如果
doAction1
是redux操作的创建者,您如果不使用调度来包装它,就不能调用它。直接调用doAction1(…)
不会触发减速机
大概您已经使用mapDispatchToProps
接收doAction1
作为组件的道具,因此可以这样调用它:this.props.doAction1(…)
。也就是说,this.props.doAction1
本质上是一个dispatch
wrappeddoAction1
因此,如果我的理解是正确的,那么你想要这样的东西:
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
wrappeddoAction1
因此,如果我的理解是正确的,那么你想要这样的东西:
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时,应该使用分派包装它