如果redux中的状态应该是不可变的,我将如何与有状态API交互?

时间:2017-05-27 13:44:24

标签: redux react-redux

所以在这个应用程序中,我使用的是MediaRecorder api(https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder)。我试图使用React-Redux作为网站的框架。以下是我的减速器的简化版本,以说明我的问题:

(state = {}, action) => {
    switch(action.type){
        case "START_RECORDING":
            return new MediaRecorder(...).start();
        case "STOP_RECORDING":
            state.stop(); <--- is this ok?
            return {};
    }
    return state;
})

所以我读到redux状态应该是不可变的。但是,我必须以某种方式停止媒体录制器,以便它停止录制内容。这是state.stop()好吗?

1 个答案:

答案 0 :(得分:5)

不,这绝对是一个糟糕的模式。

根据Redux常见问题解答,your store state should only be plain serializable JS data。因此,您可以在商店中跟踪{playing : true}之类的值,但实际上不应该在那里保留类实例。

执行此操作的“正确”方法是使用React组件包装命令式MediaRecorder API,从Redux存储中接收值作为props,并在其React生命周期方法中调用MediaRecorder函数,如{{1 }}。我在博文Declaratively Rendering Earth in 3D, Part 2: Controlling Cesium with React中展示了一些如何执行此操作的示例,并且我在React Component Patterns#Wrapping Non-React CodeReact/Redux links list部分中提供了其他类似文章的链接。

一个简单的例子可能如下:

componentWillReceiveProps