跳到主要内容

createDraft / finishDraft

egghead.io 第11课: 创建异步 producers(以及为什么不应该这样做)

createDraft and finishDraft

createDraftfinishDraft 是两个底层函数,它们对于在 immer 之上构建抽象的库非常有用。它避免了为了使用 draft 始终创建函数。相反,人们可以创建一个 draft,对其进行修改,并在未来的某个时间完成该 draft,在这种情况下,将产生下一个不可变状态。例如,我们可以将上面的示例重写为:

Beyond that, createDraft / finishDraft could be used to express async updates to drafts:

import {createDraft, finishDraft} from "immer"

const user = {
name: "michel",
todos: []
}

const draft = createDraft(user)
draft.todos = await (await window.fetch("http://host/" + draft.name)).json()
const loadedUser = finishDraft(draft)

注意:finishDraft 以一个 patchListener 作为第二个参数,可以用来记录 patches,类似于 produce

警告:一般情况下,我们建议使用 producer 而不是 createDraft / finishDraft 组合,produce 在使用中不易出错,并且在代码中更清楚地区分了可变性和不变性的概念。