标题可能不够清晰,请考虑这个例子:
如果我有一个数据表,您可以选择多行,然后单击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会让我的组件包含很多道具只是因为某些操作需要它们(或者这可能完全没问题?)。
感谢。
答案 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());
};
}