Skip to content

Latest commit

 

History

History
58 lines (45 loc) · 1.78 KB

current.md

File metadata and controls

58 lines (45 loc) · 1.78 KB
id title sidebar_label
current
Extracting the current state from a draft
Current

Immer exposes a named export current that create a copy of the current state of the draft. This can be very useful for debugging purposes (as those objects won't be Proxy objects and not be logged as such). Also, references to current can be safely leaked from a produce function. Put differently, current provides a snapshot of the current state of a draft.

Objects generated by current work similar to the objects created by produce itself.

  1. Unmodified objects will be structurally shared with the original objects.
  2. If no changes are made to a draft, generally it holds that original(draft) === current(draft), but this is not guaranteed.
  3. Future changes to the draft won't be reflected in the object produced by current (except for references to undraftable objects)
  4. Unlike produce objects created by current will not be frozen.

Use current sparingly, it can be a potentially expensive operation, especially when using ES5.

Note that current cannot be invoked on objects that aren't drafts.

Example

The following example shows the effect of current (and original):

const base = {
	x: 0
}

const next = produce(base, draft => {
	draft.x++
	const orig = original(draft)
	const copy = current(draft)
	console.log(orig.x)
	console.log(copy.x)

	setTimeout(() => {
		// this will execute after the produce has finised!
		console.log(orig.x)
		console.log(copy.x)
	}, 100)

	draft.x++
	console.log(draft.x)
})
console.log(next.x)

// This will print
// 0 (orig.x)
// 1 (copy.x)
// 2 (draft.x)
// 2 (next.x)
// 0 (after timeout, orig.x)
// 1 (after timeout, copy.x)