当前位置: 首页 > 知识库问答 >
问题:

我能在减速器中调度一个动作吗?

暴招
2023-03-14

是否可以在一个减速器中发送一个动作?我有一个progressbar和一个音频元素。目标是在音频元素中更新时间时更新progressbar。但我不知道将ontimeupdate eventhandler放置在何处,也不知道如何在ontimeupdate的回调中分派操作来更新ProgressBar。下面是我的代码:

//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;

共有1个答案

伍耀
2023-03-14

在reducer中调度一个动作是一种反模式。您的reducer应该没有副作用,只需消化action有效负载并返回一个新的state对象。在还原器内添加侦听器和调度操作会导致链接操作和其他副作用。

听起来,初始化的AudioElement类和事件侦听器属于组件中,而不是状态中。在事件侦听器中,您可以分派一个操作,该操作将更新状态中的progress

您可以在新的React组件中初始化AudioElement对象,也可以将该类转换为React组件。

class MyAudioPlayer extends React.Component {
  constructor(props) {
    super(props);

    this.player = new AudioElement('test.mp3');

    this.player.audio.ontimeupdate = this.updateProgress;
  }

  updateProgress () {
    // Dispatch action to reducer with updated progress.
    // You might want to actually send the current time and do the
    // calculation from within the reducer.
    this.props.updateProgressAction();
  }

  render () {
    // Render the audio player controls, progress bar, whatever else
    return <p>Progress: {this.props.progress}</p>;
  }
}

class MyContainer extends React.Component {
   render() {
     return <MyAudioPlayer updateProgress={this.props.updateProgress} />
   }
}

function mapStateToProps (state) { return {}; }

return connect(mapStateToProps, {
  updateProgressAction
})(MyContainer);

请注意,updateProgressAction自动与dispatch包装在一起,因此您不需要直接调用dispatch。

 类似资料:
  • 问题内容: 是否可以在减速器本身中调度动作?我有一个进度栏和一个音频元素。目标是在音频元素中的时间更新时更新进度条。但是我不知道在哪里放置ontimeupdate事件处理程序,或者如何在ontimeupdate的回调中分派操作以更新进度条。这是我的代码: 问题答案: 在减速器内调度动作是一种反模式 。减速器应该没有副作用,只需消化操作有效负载并返回新的状态对象即可。在Reducer中添加侦听器和调

  • 按照我的理解,当一个动作被调用时,所有的减速器都响应。如果action存在于reducer的语句中,则执行action。如果没有,则执行,保留现有状态。 当操作存在于reducer中,但它试图更新的特定属性不存在时,它似乎表现良好,因为没有什么可更新的。 例如,我有一个action creator,用于设置Modals的属性。每个模式都有自己的。我的代码如下所示: 我在多个精简器中都有,但是如果没

  • Redux正在扔给我: 错误:预计减速机是一个功能。在线路上 从索引: 从配置: index.js 配置存储。js 减根剂 模拟减速器 找不到bug。我第一次用devtools插件支持创建redux商店

  • 我有一个逻辑问题,我是否应该对操作中的每个回调进行多个函数调用: 或者我可能想把这些调用转移到redux减速机中,然后从那里调用下一个函数? 第二种方法在我看来像是反模式,会产生意大利面条式的代码...也许我错了?

  • 作为挂钩新手,我正在转换一些具有多个状态属性的旧代码,在搜索如何减少最初设置的useState挂钩数量时,我遇到了这段代码(失去了链接)。以下useReducer钩子代码按预期工作。我想我知道state值是通过setState(dispatch)更新的,我想弄清楚的是reducer的第二个参数是如何使用spread语法在state和newState之间复制值的。我看到的所有示例都使用switch语

  • 我知道这是一个类似的问题。我已经看过一些答案,但没有一个有效。事情是这样的,我正在为我的MapReduce程序编写一个mapper和reducer,我得到以下错误 回溯(最近一次调用最后一次):文件“/usr/local/hadoop//reducer.py”,第10行,在desc中,count=line。拆分(“\t”,1)值错误:需要多个值才能解包 我无法调试错误,因为我不知道是什么导致了这个