根据reducer状态更改在特定组件中调度操作

时间:2016-10-24 06:15:03

标签: reactjs redux

在redux中,如果特定的reducer状态发生变化,我想显示一个模态。仅在用户正在查看特定组件时才有意义。我使用了容器的mapDispatchToProps(publishState来自reducer):

const mapDispatchToProps = (stateProps, dispatchProps, ownProps) => {

    const {dispatch} = dispatchProps;
    const {appType, publishState, publishStages} = stateProps;
    const isWebsite = (appType !== 'MOBILE');

    switch (publishState.stage) {
        case publishStages.GENERATING_BUILDREQUEST:
        case publishStages.WAITING:
        case publishStages.WORKING:
        case publishStages.UPLOADING:
            dispatch(showModal(modalTypes.PUBLISH_MODAL, {isWebsite}));
            break;

        case publishStages.COMPLETED:
            dispatch(showModal(modalTypes.PUBLISH_SUCCESS_MODAL, {isWebsite}));
            break;

        case publishStages.ERROR:
            dispatch(showModal(modalTypes.PUBLISH_FAILURE_MODAL, {isWebsite}));
            break;

        default:
            dispatch(closeModal());
    }

    return {...

然而,这并不会让人觉得优雅,因为人们不会期望映射功能能够调整状态。任何想法如何正确实现这一点?

1 个答案:

答案 0 :(得分:3)

我确实不会在mapDispatchToProps函数中调用dispatch。这个函数应该是“纯粹的”,只返回一个没有任何副作用的映射。

因为你知道什么动作应该触发模态,即。当publicStages被设置为特定值时,我建议以两种可能的方式来改变状态:

  1. 您可以在reducer中执行此操作。当您更改publicStages时,reducer也可以访问模态状态,并进行更改。
  2. 在行动中。在更改PublicStages的操作中,根据您对publicStages的操作,调用操作以打开/关闭模式。请注意,调用dispatch应该是异步的。在这种情况下,您还需要从操作中调度,因此您必须将调度功能向下传递给操作。
  3. 编辑:按照评论中的讨论 - 以及完整性 - 如果模式仅作为一个可视组件的一部分显示,您还可以将其open/closed状态存储在组件本身中并在{{ 1}}和componentWillMount。关于Redux创作者Dan Abramov的有趣读物是You Might Not Need Redux