LoginSignup
2
1

More than 5 years have passed since last update.

React Hooksのdispatchにイベントオブジェクトを投げて失敗

Posted at

React Hooksを活用していたところ、ちょっと手抜きしようとして失敗してしまいました。

React Hooksのreducer

React HooksにはuseReducerという関数があります。詳細はリファレンスを参照していただきたいのですが、ここにreducerとして渡す関数は、「1つ目の引数に前のstate、2つ目に変更内容を取って、次のstateを返す」ということだけ決まっていて、「変更内容」としてReduxのような特定の形をしたオブジェクトを要求するわけではない、ということがあります。

手抜き…に失敗

それなら、「変更内容として、イベントオブジェクトをそのまま渡してしまって、e.target.namee.target.valueを読み取ってそこから値を取れば、onChange={dispatch}とできるんじゃないか」ということで、そのように実装してみました(動かないのでコード略)。

結果は、エラーとなりました。

SyntheticEvent

実は、Reactのイベントでは本物のイベントオブジェクトではなく、SyntheticEventというReact独自のイベントオブジェクトを投げてきます。そして、これは効率化のためイベントが終われば再利用されますリファレンス)。結果、dispatchなどの非同期更新に投げてしまうと、うまく動かなくなります。

イベントオブジェクトから値を抽出したい場合、イベントハンドラ内で同期的に行っておきましょう。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1