[解決済み】Reduxアプリケーションでコード分割のためにreducersを動的にロードする方法は?
質問
Reduxに移行しようと思うのですが、どうすればいいですか?
私のアプリケーションは多くのパーツ(ページ、コンポーネント)で構成されているので、多くのreducerを作成したいです。Reduxのサンプルによると、私は
combineReducers()
を使用して、1 つのレデューサを生成します。
また、私の理解では、Reduxアプリケーションは1つのストアを持つべきで、それはアプリケーションが起動した時点で作成されるものです。ストアが作成されるとき、私は私の結合されたreducerを渡す必要があります。これは、アプリケーションがあまり大きくない場合、理にかなっています。
しかし、複数のJavaScriptバンドルをビルドする場合はどうでしょうか?例えば、アプリケーションの各ページが独自のバンドルを持っている場合です。この場合、1つのreducerを組み合わせるのは良くないと思います。Reduxのソースを見てみると、以下のようなものがありました。
replaceReducer()
関数があります。それは私が欲しいものであるように思われる。
アプリケーションの各部分ごとに結合したreducerを作成し、それを
replaceReducer()
アプリケーションのパート間を移動するとき。
これは良い方法なのでしょうか?
どのように解決するのですか?
<ブロッククオート更新情報:こちらもご覧ください ツイッターのやり方 .
これは完全な答えではありませんが、あなたが始めるための助けになるはずです。なお、私は 古いリデューサを捨てない -新しいものを組み合わせリストに追加しているだけです。古いリデューサを捨てる理由はありません。最大のアプリでも、何千もの動的モジュールを持つことはないでしょう。 かもしれない は、アプリケーションの中でいくつかのリデューサを切断したいと思います。
レデューサー.js
import { combineReducers } from 'redux';
import users from './reducers/users';
import posts from './reducers/posts';
export default function createReducer(asyncReducers) {
return combineReducers({
users,
posts,
...asyncReducers
});
}
ストア.js
import { createStore } from 'redux';
import createReducer from './reducers';
export default function configureStore(initialState) {
const store = createStore(createReducer(), initialState);
store.asyncReducers = {};
return store;
}
export function injectAsyncReducer(store, name, asyncReducer) {
store.asyncReducers[name] = asyncReducer;
store.replaceReducer(createReducer(store.asyncReducers));
}
ルーティング.js
import { injectAsyncReducer } from './store';
// Assuming React Router here but the principle is the same
// regardless of the library: make sure store is available
// when you want to require.ensure() your reducer so you can call
// injectAsyncReducer(store, name, reducer).
function createRoutes(store) {
// ...
const CommentsRoute = {
// ...
getComponents(location, callback) {
require.ensure([
'./pages/Comments',
'./reducers/comments'
], function (require) {
const Comments = require('./pages/Comments').default;
const commentsReducer = require('./reducers/comments').default;
injectAsyncReducer(store, 'comments', commentsReducer);
callback(null, Comments);
})
}
};
// ...
}
もっときれいな表現があるかもしれませんが、アイデアを示しただけです。
関連
-
vue3レスポンシブ対応のためのsetup+ref+reactive
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] Reduxのアクションをタイムアウトでディスパッチする方法とは?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
JSクロスドメインソリューション リアクト構成 リバースプロキシ
-
JSアレイループと効率解析の比較
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み】 `string.split is not a function` というエラーの原因は何ですか?
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
フロントエンド非同期(アシンク)ソリューション(全ソリューション)