MobXでのReduxアーキテクチャの実装。パート1:「Reduxの問題の場所」

記事のこの部分は、Reduxの成分を理解することについてです。それらはとても必要ですか、それらの類似物は何ですか。useReducerフックのより便利な代替手段も提案されます。





実際、Reduxは再現しません。代わりに、次のパートでは、MobXを使用してより優れたアーキテクチャを設計する方法について説明します。次の部分は主に、MobXでのプロジェクトが、制御されていない変更で混乱していることが判明した人向けです。





記事のこの部分では、次のことを示したいと思います。





  • レデューサーは、新しい状態を取得するための通常の純粋関数の類似物です。





  • セレクターは、データを返す通常のメモ化された関数に類似しています。





  • ディスパッチ+アクション+アクションクリエーターは通常の関数呼び出しに類似しており、ディスパッチ、アクション、アクションクリエーターへの分割は不要であり、場違いで使用されることがよくあります。





この記事では、ボイラープレートを削減するためのReduxToolkitやその他のライブラリについては説明しません。Reduxが最初に使用された方法と同じです。Reduxライブラリの開発者が登場したストアコードの同様の構造は、MobXやVuexなどの他の状態管理者にRedux Toolkitがよりユーザーフレンドリーな形式で登場する前に存在していたことに注意してください(私は時々それについて言及します) 、MobXに似ているので、私は彼に少し精通しています)。





前編の内容





1つのストレージ(ストア)と複数のストレージ

片面アプローチには、長所と短所の両方があります。しかし、VuexおよびMobXプロジェクトは、複数のストアでうまく機能します。さらに、プロジェクト内の店舗の存在はオプションです。ただし、データとロジックをプログラムの他の部分から分離すること、およびデータをロジックから分離することにより、開発中に追加の機会と利便性が提供されます。





" " , . , ( , localStorage/sessionStorage, ) , . Redux , , .





Reducer vs . SOLID

- , , Redux, . , , , () - .





- ugly switch O(n), actions . O(n) , 60 . – . swith - [actionNameKey][function] .





- , , , , .





3 SOLID GRASP

, . , / / . . . " SOLID" " ". : " , SOLID, , , ". . - , /. , , , .





" ". , ,  . .





single-responsibility principle (SRP)

,   . . , . "" -. - , .





, - . . actions. actions. , . , combineReducers.





/

/ , :





  • : , .





  • : , , .





, .





action , . . ( JS ), . , action-.





, . , , Redux - actions , , , . , actions .





LSP - , , , .





https://medium.com/webbdev/solid-4ffc018077da - , : " , , ."





, . , LSP, . , . " ..." , .





. , , , switch, , action -.





.





(High Cohesion) GRASP

( /) - , . ", ." , , .





, switch, . , . . action.type. , case . / /. - , .





SRP SOLID. . , actions, . , action, .





. . , .





. , – . , - action, . - . - , , . :





case 'todos/todoAdded': {
  return {
    ...state,
    todos: [
      ...state.todos,
      action.paylod.newTodo
    ]
  }
}
      
      



:





function todoAdded(state, newTodo) {
  return {
    ...state,
    todos: [
      ...state.todos,
      newTodo
    ]
  }
}
      
      



- , . type action, Redux, . - . , , / : todoStore['todoAdded'].





vs ,

Redux - . , - . .





MobX (computed values). , , JS . . , Vuex - .





Redux, , middleware. . MobX .





- MobX vs - middleware's

Redux - , , .





Vuex MobX , action API -. Vuex - . , . -, ( ). MVC .   MVC wikipedia - MVC, . , Vuex MobX - MVVM, MVC.





, , . , . , , AngularJS 1.x. , .





- . 2 (, api ), . – ,   . , .





, - , , , . () .





Action creators, actions, dispatch VS

  Redux - .   .





, , - . Redux pub/sub (-).





Pub/sub ( ) , .





, , :





  • . , ( ) .





  • , - , . , . - React . , .. react-.





Redux action-? :





  1. , middleware;





  2. middleware, ;





  3. , , .





? . , - , . actions - . 3- actions . 3 actions ( ).





1. middleware- ( ). , ?





Action, middleware, . .





. dispatch middleware-? -, . , .. . , middleware- middleware .





-, .





2. Middleware . . action ? . , .





3. actions . actions action , . .





- useReducer?

, - , .





useReducer , . . actions, .. , . useReducer - .





useReducerと同様の機能は、useStateを介して手動で実行できますが、これは長くて不便です。でも毎回できるわけではなく、別々に取り出してみました。より読みやすく使いやすいコードを書くために、useStateWithUpdatersフックを作成しました。以下はその使用例です。





const updaters = {
  subtract: (prevState, value) => (
    { ...prevState, count: prevState.count - value }
  ),
  add: (prevState, value) => (
    { ...prevState, count: prevState.count + value }
  ),
};

const MyComponent = () => {
  const [{ count }, {add, subtract}] = 
        useStateWithUpdaters({ count: 0 }, updaters);
  return (
    <div>
      Count: {count}
      <button onClick={() => subtract(1)}>-</button>
      <button onClick={() => add(1)}>+</button>
    </div>
  );
};
      
      



その実装は問題にあります。TypeScriptバージョン

があります。





また、少し改善することもできます。フック自体の実装で新しい状態を前の状態と組み合わせて、常に「... prevState」と記述する必要がないようにします。








All Articles