Deep dive to immer
This article basically takes time to learn about immer immer. If you don't know immer, I recommend reading next chapter first.
What is my curious?
Q1. How does immer
change the mutable update way to immutable update way?
immer
functions to return data immutably even when using the object built-in method that changes to be mutable.
Let's find out how this function works internally.
This example is following basic example of immer official docs
import produce from 'immer';
const baseState = [
{
title: "Learn TypeScript",
done: true,
},
{
title: "Try Immer",
done: false,
},
]
const nextState = produce(baseState, (draft) => {
draft.push({ title: "Tweet about It" });
draft[1].done = true;
})
console.log(baseState === nextState) // false
console.log(nextState)
/*
[
{
title: "Learn TypeScript",
done: true,
},
{
title: "Learn TypeScript",
done: true,
},
{
title: "Tweet about It",
},
]
*/
Q2. How does immer
use structural sharing
?
*structural sharing
: When coping an object, the same reference is used for an object that has not been changed.
To update object immutably means that original object is copied to new object. In other word, copy needs to cost.
When immer
copy object, the unchanged reference copies the object using the structural sharing method that is reused.
Let's find out what kind of structural sharing is used in immer
.
Q3. immer
sometimes updates data through return rather than mutable updating the draft within produce
function,
in which case the logic is different?
When using an immer
, there is a case of returning a new object instead of the mutable update method suggested above.
This is same as the method of returning objects from javascript immutably regardless of the immer.
immer
officially is guiding this way and
There will be many developers who use both methods, the method of changing objects to be mutable and method of changing objects to be immutable.
Let's see what logic differences these differences cause in the immer
.
// mutable method
const nextState = produce(baseState, (draft) => {
draft.push({ title: "Tweet about It" });
draft[1].done = true;
})
// immutable method
const nextState = produce(baseState, (draft) => {
return {
...baseState,
{ ...baseState[1], done: true },
{ title: "Tweet about It" },
}
})
- Experience using an
immer
orredux-toolkit
- Understanding of Proxy (optional)