如果某个操作需要使用某个当前状态,谁应该从商店中获取它?

时间:2016-12-21 09:35:25

标签: reactjs redux react-redux

标题可能不够清晰,请考虑这个例子:

如果我有一个数据表,您可以选择多行,然后单击delete之类的操作按钮。

现在我的行​​动.js:
selectedRows是一个包含行索引的数组,getSelectedPostIds是一个选择器,可以将selectedRows提取并转换为postIds

import { getSelectedPostIds } from 'selectors'

export const deletePosts = () => (dispatch, getState) => {
  // encapsulate the parameter `postIds` in action
  const postIds = getSelectedPostIds(getState())
  dispatch({ type: 'DELETE' })
  deletePostsApi(postIds)
  // .then(...)
  // .catch(...)
}

这个设计有什么问题吗?或者我应该避免在操作中使用getState,只需将postIds作为参数传递给操作:

export const deletePosts = postIds => dispatch => {
  dispatch({ type: 'DELETE' })
  deletePostsApi(postIds)
  // .then(...)
  // .catch(...)
}

唯一的区别是谁应该从商店获取状态(使用选择器),1。动作或2.将调度操作的组件(通过mapStateToProps)。

我不确定方法1,方法2会让我的组件包含很多道具只是因为某些操作需要它们(或者这可能完全没问题?)。

感谢。

2 个答案:

答案 0 :(得分:2)

这可能是品味问题。我通常喜欢直接访问getState,因为你指出,避免传递很多道具。通过这样做,操作更容易集成到不同的组件中(我只需要调用它而不是另外编辑mapStateToProps)。此外,由于最终两种方式都访问全局存储,因此预期的redux数据流不会受到任何影响。

答案 1 :(得分:0)

如果您想在动作创建者中使用状态,则可以使用redux-thunk。 :)

https://github.com/gaearon/redux-thunk

function yourActionCreator() {
  // Redux-thunk will catch all action creators that return functions
  return (dispatch, getState) => {
    // u can use state here
    const { counter } = getState();

    if (counter % 2 === 0) {
      return;
    }
    // Dispatch your action creator as you would normally do
    dispatch(increment());
  };
}