React Hooksを活用していたところ、ちょっと手抜きしようとして失敗してしまいました。
React Hooksのreducer
React HooksにはuseReducer
という関数があります。詳細はリファレンスを参照していただきたいのですが、ここにreducer
として渡す関数は、「1つ目の引数に前のstate
、2つ目に変更内容を取って、次のstate
を返す」ということだけ決まっていて、「変更内容」としてReduxのような特定の形をしたオブジェクトを要求するわけではない、ということがあります。
手抜き…に失敗
それなら、「変更内容として、イベントオブジェクトをそのまま渡してしまって、e.target.name
やe.target.value
を読み取ってそこから値を取れば、onChange={dispatch}
とできるんじゃないか」ということで、そのように実装してみました(動かないのでコード略)。
結果は、エラーとなりました。
SyntheticEvent
実は、Reactのイベントでは本物のイベントオブジェクトではなく、SyntheticEvent
というReact独自のイベントオブジェクトを投げてきます。そして、これは効率化のためイベントが終われば再利用されます(リファレンス)。結果、dispatch
などの非同期更新に投げてしまうと、うまく動かなくなります。
イベントオブジェクトから値を抽出したい場合、イベントハンドラ内で同期的に行っておきましょう。