[解決済み】reducerでアクションをディスパッチすることはできますか?
2022-04-02 09:08:50
質問
は、reducer 自体でアクションをディスパッチすることは可能でしょうか?私はプログレスバーとオーディオ要素を持っています。目標は、audio要素で時間が更新されたときにprogressbarを更新することです。しかし、私はどこに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;
解決方法は?
reducer内でアクションをディスパッチすることはアンチパターンである . リデューサーは副作用がなく、単にアクションのペイロードを消化して新しいステートオブジェクトを返すだけであるべきです。リスナーを追加して、アクションをリデューサ内でディスパッチすると、アクションの連鎖やその他の副作用を引き起こす可能性があります。
を初期化したようです。
AudioElement
クラスとイベントリスナーは、ステートではなくコンポーネントに属しています。イベントリスナー内でアクションをディスパッチすることができ、それによって
progress
を状態表示します。
を初期化することもできます。
AudioElement
クラスオブジェクトを新しい React コンポーネントで使用するか、そのクラスを 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
ということで、ディスパッチを直接呼び出す必要はありません。
関連
-
[解決済み】ngrokがReact devサーバーに接続しようとすると、無効なホストヘッダが表示される。
-
[解決済み] React.createElement: type is invalid -- expected a string.
-
[解決済み] TypeError: reactjs の未定義のプロパティ 'status' を読み取ることができません。
-
[解決済み] formcontrollabel - material-ui | Reactのデフォルトのtypography classを変更するには?
-
[解決済み] React の open mailto E-Mail クライアントの onClick で textarea から本文を取得する。
-
[解決済み] reactstrapのドロップダウンで選択されたアイテムを設定する方法は?
-
[解決済み] sh: react-scripts: npm start の実行後にコマンドが見つからない。
-
[解決済み] componentWillReceivePropsライフサイクルメソッドはいつ使用するのですか?
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する
-
[解決済み] Reduxのアクションをタイムアウトでディスパッチする方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React - 式は1つの親要素を持つ必要がありますか?
-
[解決済み】<Router>の外側で<Link>を使用してはならない
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避するにはどうすればよいですか?
-
[解決済み] material-ui-pickers KeyboardDatePicker をモーメントで使用するには?
-
[解決済み] ReactjsのEsLintの "react / jsx-props-no-spreading "エラーを無効化する。
-
[解決済み] react.jsでng-ifに相当するものは何ですか?
-
[解決済み] は、gatsby-imageで動作する良いreactのカルーセルコンポーネントはありますか?[って聞かれます。]
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する
-
[解決済み] ESLintとTSLintの違い【クローズド】について
-
[解決済み] Reduxのアクションをタイムアウトでディスパッチする方法とは?