3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【React】MapオブジェクトをStateで管理する場合の留意点

Posted at

概要

ユースケースとしてあまり無いかもしれませんが、JavaScriptのMapオブジェクトをReactのStateで管理する場合、どう更新するのかというのがふと気になりました。
Mapオブジェクトの概要については、Mapオブジェクトに関してにまとめられていますが、更新する際には基本的に作成したオブジェクトに対して、破壊的な変更が行われます。つまり、配列の更新時にハマりがちな、useStateで配列を更新するの記事にあるObject.is()が同じ値になる問題と、同様の考慮がMapオブジェクトでも必要になってきます。

対応

挙げられる対応として、Using ES6 Map with React State hooksの記事にある通り、更新操作を行った後にnew Mapで当該オブジェクトのcloneを作成し、stateにセットするというやり方が挙げられます。

実装サンプル

上記の対応内容で、stateを更新する実装サンプルは以下のとおりです。

const [sampleMap, setSampleMap] = useState(new Map());

// Mapの更新操作
const updateMap = (key, value) => {
  sampleMap.set(key, value)
  setSampleMap(new Map(sampleMap));
}
3
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?