从 draft 中提取当前 state
Immer 暴露了一个命名导出的 current函数,可以创建 draft 对象当前状态的一个副本。 这对于调试非常有用(因为这些对象不会是代理对象,也不会被记录下来)。 此外,对 current 的引用可以安全地从 produce 函数中释放。换句话说,current 提供 draft 当前状态的快照。
current 工作生成的对象类似于 produced 本身创建的对象。
- 未修改的对象将在结构上与原始对象共享。
- 如果未对 draft 进行任何更改,通常它会保留 original(draft) === current(draft),但这并不能保证。
- 未来对 draft 的更改不会反映在
current生成的对象中(不可被 draft 对象的引用除外) - 与
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
})