所以在这个应用程序中,我使用的是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()
好吗?
答案 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 Code的React/Redux links list部分中提供了其他类似文章的链接。
一个简单的例子可能如下:
componentWillReceiveProps