Reducerのリファクタリング
Closed this issue · 2 comments
ツッコミどころ
- idじゃなくてindexだと思う
- indexを状態に持たせるのか、元となってる配列をstateに持たせるのか
- 現状、presentational containerであるinteractionがconstからデータを引っ張ってくるような作りになっており、違和感がある
- こういうのはせめてコンテナコンポーネントが処理するだけで、presentationalは受け取ったものを表示するだけにしたい
- まあstateに全部持たせちゃうのが良いと思う
- 関数名がセンスない
- なんで状態を表す名前になっているのか
- isStart -> starter
- resultIs -> resultSwitcher
- data -> ideas
メイン編
操作したいindexをactionとして渡すのは問題ない。
配列の要素を書き換えると怒られる。
stateの中身を書き換えてはいけないので、stateに配列を持たせた場合、pushやpopを使ってはならない。
必ず新しい配列を作る.
(公式) https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns#inserting-and-removing-items-in-arrays
(日本語) https://qiita.com/ssnyarii/items/f295c45e1705677a7a48
一回のactionごとにstateがもっている配列の中身を減らしていって、配列が空になったときに結果を表示させたい場合、配列が空かどうかの判定は誰がやるのか -> Containerかな
Reducerが担当しても、配列が空だったときの処理を状態だけでやりきるのは無理そう
結果表示編
ボタンを押すと何種類かのビューを順繰りに切り替えられるようにするようなUIを作りたい場合、
片方向循環リストを作るよりは、indexだけを状態として持たせてしまう
reducerとしてはindexをプラス1すれば良いのだが、どこかで0に戻さなければいけない。
方法は以下の通り
- indexをactionとして持たせる。0に戻すのはコンテナで行う
- indexがリストの端に達した時点でindexを0に戻すactionを実行する
- INT_MAXになったら0に戻す処理をreducerに追加する
その際、リストの長さをReducerは知らないので、コンテナにindexを持たせる
結果の表示に関しては他に良い方法がない気がする。
せめてINT_MAXになったらリセットする機能くらい入れたい
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER
結果表示について
ShowResult
をコンテナコンポーネントにする必要性を感じない。
AppContainer
でstateからデータを取ってきて、データを下ろしていくようにしてほしい。
一旦終わりでいいかな