是否可以在减速器本身中调度一个动作?我有一个进度条和一个音频元素。目标是在音频元素中的时间更新时更新进度条。但是我不知道ontimeupdate事件处理程序放在哪里,或者如何在ontimeupdate的回调中调度一个动作,来更新进度条。这是我的代码:
//reducer
const initialState = {
audioElement: new AudioElement('test.mp3'),
progress: 0.0
}
initialState.audioElement.audio.ontimeupdate = () => {
console.log('progress', initialState.audioElement.currentTime/initialState.audioElement.duration);
//how to dispatch 'SET_PROGRESS_VALUE' now?
};
const audio = (state=initialState, action) => {
switch(action.type){
case 'SET_PROGRESS_VALUE':
return Object.assign({}, state, {progress: action.progress});
default: return state;
}
}
export default audio;
原文由 klanm 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 reducer 中调度动作是一种反模式。您的 reducer 应该没有副作用,只需消化操作负载并返回一个新的状态对象。在 reducer 中添加侦听器和调度操作可能会导致链接操作和其他副作用。
听起来像您初始化的
AudioElement
类和事件侦听器属于组件而不是状态。在事件侦听器中,您可以调度一个操作,该操作将更新progress
状态。您可以在新的 React 组件中初始化
AudioElement
类对象,或者只是将该类转换为 React 组件。请注意,
updateProgressAction
会自动用dispatch
包装,因此您无需直接调用 dispatch。