处理react-redux

时间:2016-10-14 06:33:13

标签: reactjs redux react-redux redux-thunk

假设有async read(args)方法返回一些数据。 我使用redux-thunkredux-promise来发送异步操作。 该方法需要访问redux存储,以便能够读取状态树的某些部分,以及传递给thunkMiddleware.withExtraArguments()的额外参数。该方法是抽象的,并且该方法的特定实现可能需要访问状态树的不同部分(例如,当前会话的ID,数据源的名称等)。 从方法返回的数据在传递给执行渲染的组件之前需要进行后处理。

我正在考虑以下方法来实现上述目标:

方法1。getState函数传递给async read()方法;实现这样的动作创建者:

  const actionRead=()=>async (dispatch, getState, {rpc})=>{
   dispatch({type:ActionReadStarted, ...});
   let data=await read(rpc, getState);
   // post process the data as needed
   dispatch({type:ActionReadComplete, data});
  };

我不喜欢的是直接传递给getState方法的read

方法2。使read()方法成为行动创作者:

const actionRead=()=>async (dispatch, getState, {rpc})=>{
 dispatch({type:ActionReadStarted, ...});
 let data=await dispatch(read());
 // post process the data as needed
 dispatch({type:ActionReadComplete, data});
};

const read=()=>(dispatch, getState, {rpc})=>{
 const arguments=getState().some_arguments;
 return rpc.actual_read_returns_promise(arguments);
}

在这两种情况下,reducer只是将数据写入商店。我不能将后处理逻辑放在reducer中,因为它可能会导致副作用。

我个人赞成第二种方法,但是这篇帖子建议dispatch不应该返回任何数据:https://github.com/reactjs/redux/issues/61

我向大师提出的问题:哪种方法更符合react-redux最佳做法?是否有更好的方法来实现上述目标?

修改 现在我正在修改第一种方法:

const actionRead=(args)=>async (dispatch, getState, api)=>{
 dispatch({type:ActionReadStarted, ...});
 let data=await read(args)(dispatch, getState, api);
 // post process the data as needed
 dispatch({type:ActionReadComplete, data});
};

const read=(args)=>(dispatch, getState, {rpc})=>{
 const arguments=getState().some_arguments;
 return rpc.actual_read_returns_promise({...args, ...arguments});
}

1 个答案:

答案 0 :(得分:0)

每个reducer都可以访问它自己的状态片段,因此它不需要传递给它的任何数据,这些数据已经存在于它自己的状态中。如果您有一个需要更新多个状态切片的操作,这些切片是单独的reducer的一部分,则每个reducer都应该监听操作并分别修改自己的状态。这种动作和减速器的分离是我认为使redux变得非常强大的一个原因。

因此,在我看来,最好的方法是发出一个动作,例如" READ"无论从read函数返回什么。然后每个包含由于该操作必须修改的状态的reducer将监听" READ"行动,然后修改它自己的状态。

希望这有帮助。