将值作为参数从组件传递或访问操作创建者中的状态?

时间:2016-07-19 02:37:49

标签: reactjs redux redux-thunk

在我的项目中,我有动作创建者,它依赖于应用程序状态中的值来生成新值或决定要分派的动作。我的问题是要知道哪种方法是正确的。我想到了两种方式。在动作创建者中访问这些值:

export const changePreviousPage = () => {
    return (dispatch, getState) => {
        let pagination = getState().appReducers.availability.pagination;

        let previousPage = pagination.actualPage != 1 ? pagination.actualPage - 1 : pagination.actualPage;
        dispatch({
            type: types.CHANGE_PREVIOUS_PAGE,
            previousPage
        });  
    }
};

我认为另一个选项是将值从组件传递给动作创建者:

在我的组件中

class Pagination extends Component {
    ... 
    handlePreviousPage() {
        const {pagination} = this.props;
        this.props.changePreviousPage(pagination);
    }
    ...
} 

在我的动作创作者

export const changePreviousPage = pagination => {
    let previousPage = pagination.actualPage != 1 ? pagination.actualPage - 1 : pagination.actualPage;

    return{
        type: types.CHANGE_PREVIOUS_PAGE,
        previousPage
    }
};

解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

在我看来,总是在最接近执行时使用/检索状态,这里是动作创建者(或者更确切地说是你要返回然后执行的thunk)。

请记住,调度可能会在实际的store.dispatch调用之前运行任意数量的中间件。这可能包括异步中间件,因此状态可能在调用dispatch和最终运行的store.dispatch调用之间发生了变化。

另一个需要考虑的是,您可能会在动作创建器中调度多个内容,这些内容会更改状态并使您在顶部传递给动作创建者的内容无效。还有一个原因,我认为动作创建者顶部的let state = getState()是一个坏主意,除非你非常确定在处理过程中什么都不会改变(一旦你涉及任何API调用,我总是会使用getState()再次使用而不是使用存储的变量。

同样将状态数据放入props(使用redux容器和连接辅助方法)将导致每次更改时重新呈现,这在某些情况下可能会对性能产生影响。

我的个人编码偏好也是为了让mapDispatchToProps中的内容尽可能简单(假设你在handlePreviousPage中处理你的处理程序)并避免任何数据处理(在你的例子中它并不多,但你可以很容易看看如果你为你的行动创造者准备数据,这可能会失控。)