Immer
Immutable.jsみたいなやつ
Immutable.jsより学習コストが低く、型との相性が良い
Immutable.jsより剥がすのも楽
github
docs
用語
current
現在の状態
全てのオブジェクトの現在の状態のことを言っている
draft
immer内で編集する部分
この中で好きなように編集する
immerから抜けたタイミングで新しいobjectが生成されてcurrentが新しいものを見る
arrayのn番目を更新したい
これの前にfindIndexかなにかでindexを特定しておく必要がある
code:ts
return produce(this, t => {
t.commentsindex = comment;
});
//spliceのほうがええんか(?)
return produce(this, t => {
t.comments.splice(index, 1, comment);
});
idがnなものを消す
filterを使う
code:ts
return produce(this, t => {
t.items = t.items.fileter(item => item.itemId === itemdId);
}
v7かv8ぐらいで
https://immerjs.github.io/immer/docs/complex-objects
code:ts
immerable = true
hooksもある
useImmer
https://github.com/immerjs/use-immer
https://stackoverflow.com/questions/61669930/whats-the-difference-between-usestate-and-useimmer
https://github.com/immerjs/use-immer/issues/43
API
produce
code:ts
const obj = { a: { b: { c: 1, d: 2 } }, e: 3 }
const newObj = immer(obj, draft => {
draft.a.b.d = 4
})
↑これ動かないかもmrsekut.icon
draft.なんかでアクセスできるのは一つまでっぽい(?)
draft.a = 4はいけるけど
draft.a.b = 4はだめ、みたいな
docsの中でその言及を探したいmrsekut.icon
setAutoFreeze(false)をするとできるようになった。
ということは結局、immerの扱い方がどこかおかしいのか
setAutoFreeze()
https://immerjs.github.io/immer/docs/freezing
デフォルトでは、devモードではtrueになり、productionモードではfalseになる
trueにしているとパフォーマンスに影響するため。
trueにしていると、produceの外部では破壊的代入をできないようにする
逆にfalseにしているとimmerを使っている意味の半分ぐらいが無意味になる?
非同期関数の中でやつ
https://immerjs.github.io/immer/docs/async
この辺も見ないとmrsekut.icon
#??
draft.a.b = 4みたいにかいたときに、エラーになるときとならない時がある
message: "Cannot assign to read only property 'hogehoge' of object '#<Object>'"
draft.a.b = 4みたいにかいたときに、更新されてない時がある
ネスト深くなったときかなー、再現性がない
produceの中でproduceを使ったら動いた。意味がわからない
code:ts
// before
return produce(this, t => {
beforeGenreIds.forEach(beforeGenreId => {
t.genresbeforeGenreId.option.postPics = PostPicsFactory.create(
t.genresbeforeGenreId.option.postPics
).deletePostId(postId);
});
});
// beforeの書き換え
return produce(this, t => {
beforeGenreIds.forEach(beforeGenreId => {
const tmp = PostPicsFactory.create(t.genresbeforeGenreId.option.postPics).deletePostId(postId); // ここまでは正しい
t.genresbeforeGenreId.option.postPics = tmp; // ここで反映されていない
});
});
// after
// 最悪すぎる。冗長すぎ
return produce(this, t => {
beforeGenreIds.forEach(beforeGenreId => {
t.genresbeforeGenreId.option = produce(
t.genresbeforeGenreId.option,
o => {
o.postPics = PostPicsFactory.create(
t.genresbeforeGenreId.option.postPics
).deletePostId(postId);
}
);
});
});
似たライブラリ
Mori
http://swannodette.github.io/mori/
Immutable.js
死んだ
参考
https://hackernoon.com/introducing-immer-immutability-the-easy-way-9d73d8f71cb3
作者が書いた記事
https://lealog.hateblo.jp/entry/2018/01/18/110529
https://qiita.com/hrsh7th@github/items/0f0bc25bb7dafae67161
https://qiita.com/github0013@github/items/1b42cc3e330ad6a10014
https://qiita.com/mame_daifuku/items/9c100dd6c22deff29b2a
https://zenn.dev/uhyo/articles/immutable-immer
Immutable.jsとの違い