# 从 draft 中提取当前 state

URL: https://caijiao.org/immer/guide/current
Source: docs/immer/guide/current.md
Description: 学习如何使用 Immer 的 current 函数从 draft 中提取当前状态的快照。

Immer 暴露了一个命名导出的 `current`函数，可以创建 draft 对象当前状态的一个副本。
这对于调试非常有用（因为这些对象不会是代理对象，也不会被记录下来）。
此外，对 `current` 的引用可以安全地从 `produce` 函数中释放。换句话说，`current` 提供 draft 当前状态的快照。

`current` 工作生成的对象类似于 `produced` 本身创建的对象。

1. 未修改的对象将在结构上与原始对象共享。
2. 如果未对 draft 进行任何更改，通常它会保留 original(draft) === current(draft)，但这并不能保证。
3. 未来对 draft 的更改不会反映在 `current` 生成的对象中（不可被 draft 对象的引用除外）
4. 与 `produce` 创建的对象不同，`current` 创建的对象不会被冻结。

谨慎使用 `current`，这可能是一项潜在的昂贵操作，尤其是在使用 ES5 时。

请注意，不能在不是 draft 的对象上调用 `current`。

### 例子

以下示例显示了 `current`（和 `original` ）的效果：

```javascript
import {produce, current, original} from "immer"

const state = {name: "Micheal", children: []}

const nextState = produce(state, draft => {
	draft.name = "Michel"
	draft.children.push({
		name: "Michelle",
		age: 1
	})
	console.log(current(draft).name) // "Michel"
	console.log(current(draft).children.length) // 1
	console.log(original(draft.children[0])) // undefined (因为它是一个新对象)
	
	draft.children[0].age++
	console.log(current(draft).children[0].age) // 2
})
```

`current` 也可以用于检测一个 draft 是否被修改过：

```javascript
const state = {todos: []}

produce(state, draft => {
	// 没有修改任何内容
	console.log(current(draft) === original(draft)) // true
})

produce(state, draft => {
	draft.todos.push("Test")
	console.log(current(draft) === original(draft)) // false
})
```
