ホームページ >ウェブフロントエンド >jsチュートリアル >Redux vs Mobx:あなたのプロジェクトに最適なのはどれですか?
mobx crudの例
この投稿を楽しんでいる場合は、SitePoint Premiumにサインアップして、ReactとReduxを使用してフォームの作業に関するコースをご覧ください。
ReduxとMobxの共通点は何ですか?
クライアント側の状態管理を提供
Redux-Devtools-Extensionを介したタイムトラベルのデバッグをサポートします
初心者の場合、わずか30分でmobxを使用する方法を学ぶことができます。基本を学んだら、それだけです。新しいことを学ぶ必要はありません。 Reduxでは、基本も簡単です。ただし、より複雑なアプリケーションの構築を開始したら、次のように対処する必要があります。
reduxに機能を実装するには、少なくとも4つのアーティファクトを更新する必要があります。これには、還元剤、アクション、コンテナ、コンポーネントのコードの作成が含まれます。小さなプロジェクトに取り組んでいる場合、これは特に迷惑です。 mobxは、少なくとも2つのアーティファクト(つまり、ストアとビューコンポーネント)を更新する必要があります。
3。オブジェクト指向プログラミングの完全なサポート4。ネストされたデータを処理するのは簡単です
3 Mobx
を使用しない理由Reduxは、状態コードの書き方に関する厳格なガイドラインを提供するフレームワークです。これは、テストを簡単に書き込み、保守可能なコードを開発できることを意味します。 Mobxはライブラリであり、それを実装する方法に関するルールはありません。これの危険性は、ショートカットを取り、維持不可能なコードにつながる可能性のあるクイックフィックスを適用するのが非常に簡単であることです。
mobxの内部コードは、「魔法のように」多くのロジックを処理して、アプリケーションをリアクティブにします。データがストアとコンポーネントの間を通過する目に見えない領域があり、問題が発生したときにデバッグを困難にします。 @Actionsを使用せずにコンポーネントで状態を直接変更すると、バグのソースを特定するのに苦労するでしょう。
3。 mobx十分な理論、コードを見てみましょう。まず、各バージョンがブートストラップの方法を比較します
Reduxバージョン: Reduxでは、最初にストアを定義し、次にプロバイダーを介してアプリに渡します。また、非同期機能を処理するには、Redux-ThunkおよびRedux-Promise-Middlewareを定義する必要があります。 Redux-Devtools-Extensionを使用すると、タイムトラベルモードでストアをデバッグできます。
ここでのコードの量は、両方のバージョンでほぼ同じです。ただし、Mobxの輸入明細書は少なくなっています
props indection<span>// src/store.js </span><span>import <span>{ applyMiddleware, createStore }</span> from "redux"; </span><span>import thunk from "redux-thunk"; </span><span>import promise from "redux-promise-middleware"; </span><span>import <span>{ composeWithDevTools }</span> from 'redux-devtools-extension'; </span><span>import rootReducer from "./reducers"; </span> <span>const middleware = composeWithDevTools(applyMiddleware(promise(), thunk)); </span> <span>export default createStore(rootReducer, middleware); </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> store<span>={store}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>
Reduxバージョン: Reduxでは、React-ReduxのConnect()関数を使用して、状態とアクションがプロップに渡されます。
mobxバージョン: MOBXでは、Storesコレクションを注入するだけです。これを行うには、コンテナクラスまたはコンポーネントクラスの上部に@Injectを使用します。これにより、小道具で店舗を利用できるようになり、特定の店にアクセスして子供のコンポーネントに渡すことができます。状態とアクションの両方にストアオブジェクトのプロパティを介してアクセスされるため、Reduxの場合と同様に個別に渡す必要はありません。
<span>// src/stores/index.js </span><span>import remotedev from 'mobx-remotedev'; </span><span>import <span>Store</span> from './store'; </span> <span>const contactConfig = { </span> <span>name:'Contact Store', </span> <span>global: true, </span> <span>onlyActions:true, </span> <span>filters: { </span> <span>whitelist: <span>/fetch<span>|update|create|Event|entity|entities|handleErrors</span>/</span> </span> <span>} </span><span>}; </span> <span>const contactStore = new Store('api/contacts'); </span> <span>const allStores = { </span> <span>contactStore: remotedev(contactStore, contactConfig) </span><span>}; </span> <span>export default allStores; </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> stores<span>={allStores}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>mobxバージョンの読み取りが簡単なようです。ただし、Redux-Connect-Decoratorsを使用してReduxコードを簡素化できます。その場合、明確な勝者はいません。
ストア、アクション、および還元剤の定義
<span>// src/store.js </span><span>import <span>{ applyMiddleware, createStore }</span> from "redux"; </span><span>import thunk from "redux-thunk"; </span><span>import promise from "redux-promise-middleware"; </span><span>import <span>{ composeWithDevTools }</span> from 'redux-devtools-extension'; </span><span>import rootReducer from "./reducers"; </span> <span>const middleware = composeWithDevTools(applyMiddleware(promise(), thunk)); </span> <span>export default createStore(rootReducer, middleware); </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> store<span>={store}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>
mobxバージョン: MOBXでは、アクションのロジックと還元剤が1つのクラスで行われます。応答が受信された後に別のアクションエンティティが取得されたと呼ばれる非同期アクションを定義しました。
MobxはOOPスタイルを使用しているため、ここで定義されているストアクラスがリファクタリングされ、クラスコンストラクターを使用して複数のストアを簡単に作成できるようになりました。したがって、ここに示されているコードは、特定のドメインストアに結び付けられていない基本コードです。信じられないかもしれませんが、両方のバージョンで定義されているロジックは同じタスクを実行します。
<span>// src/stores/index.js </span><span>import remotedev from 'mobx-remotedev'; </span><span>import <span>Store</span> from './store'; </span> <span>const contactConfig = { </span> <span>name:'Contact Store', </span> <span>global: true, </span> <span>onlyActions:true, </span> <span>filters: { </span> <span>whitelist: <span>/fetch<span>|update|create|Event|entity|entities|handleErrors</span>/</span> </span> <span>} </span><span>}; </span> <span>const contactStore = new Store('api/contacts'); </span> <span>const allStores = { </span> <span>contactStore: remotedev(contactStore, contactConfig) </span><span>}; </span> <span>export default allStores; </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> stores<span>={allStores}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>
UIロード状態を更新します
reduxでフォームを作成するには、Redux-formを使用しました。 Mobxでは、Mobx-React-Formを使用しました。両方のライブラリは成熟しており、フォームロジックを簡単に処理するのに役立ちます。個人的には、プラグインを介してフィールドを検証できるため、mobx反応形式を好みます。 Redux-formを使用すると、独自の検証コードを作成するか、検証パッケージをインポートして検証を処理できます。
明らかに、Mobxのコードベースがはるかにleanせていることがわかります。 OOPスタイルと優れた開発プラクティスを使用して、アプリケーションを迅速に構築できます。主な欠点は、貧弱で維持不可能なコードを書くのが非常に簡単であることです。
一方、
Reduxはより人気があり、大規模で複雑なプロジェクトを構築するのに適しています。これは、すべての開発者がテストしてメンテナンスしやすいコードを書くことを保証するセーフガードを備えた厳格なフレームワークです。ただし、小規模プロジェクトにはあまり適していません。Mobxに移行するかReduxに固執するかどうかにかかわらず、明確なケースを作成するのに十分な情報を提供してくれることを願っています。最終的に、決定は、作業中のプロジェクトの種類と、利用可能なリソースに依存します。 プレーヤーをロードする…
ReduxとMobxの両方が優れたパフォーマンス特性を持ち、大きな状態の木を効率的に処理できます。ただし、MOBXは、状態の変化によって直接影響を受けるコンポーネントのみを更新する微細な観測可能性システムのために、特定のシナリオで特定のシナリオで優位性を持つことができます。 ?
以上がRedux vs Mobx:あなたのプロジェクトに最適なのはどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。