reduxのactionとreducerはいるのか
reduxにおいてdispatchの際に必要な情報を振り返る
actionとしてこういうのを用意して
code:js
{
type:"ADD_TODO",
text:"hello"
}
reducer内で、
code:js
case: 'ADD_TODO'
こういうかんじで新しいstateを作ってreturnする
dispatch(flux におけるstateを変更するぞという呼び出し)のときに必要なもの
古いstateから新しいstateを返す関数を用意すればいい
例
const addTodo = (newTodo) => (state) => ({...state, todos: [...state.todos, newTodo] })
こういう関数を用意して
dispatch( addTask({desc:'hello'}) )すればいい
これはuseReducerおよびそのdispatchで動く
ということで、reduxが無くても普通にfluxアーキテクチャが回せている single source of truth
state is read-only
canges are made with pure functions
ということをreduxは3つの原則として言っているが、
それを実現するためにはreduxのコアコンセプトが必要無くなってしまった
ただし、viewのテスト問題がある
viewだけで動かして動きを確かめたい
storybookとか?
そういう場合は、actionというオブジェクトを返すようにして、viewと実際の処理をばらばらにするメリットが有る
viewと処理を分離する方法は2通り考えられて、
ひとつは従来のactionとreducerの分離
もうひとつは、stateを更新する関数の方法の場合、手元で書くのは控えてDIする
jsでDIってどうやるんだというのはさておき
view自体がactionを引数とするとか?なんかややこしそう
jsのimportの外側から関数をinjectionするほうが素直
そうだ、actionというオブジェクトを返せばいいというのは、暗黙の依存になるというふうに考えたこともあった
あらためて色々やった結果、ステートがjsonで表現できててこれ以外に無いという状態は安心で、それ以外のところにstateがあるととてもしんどかった
actionオブジェクトを渡すのは、そこらへんをしっかり担保できるから良いことだなと思った