跳至主内容区

createDraft / finishDraft

[非官方测试版翻译]

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

egghead.io lesson 11: Creating async producers (and why you shouldn’t)

createDraftfinishDraft

createDraftfinishDraft 是两个底层函数,主要适用于在 Immer 之上构建抽象库的场景。它们消除了总是需要创建函数才能操作草稿的限制。开发者可以直接创建草稿、修改它,并在未来某个时刻完成草稿处理,此时将生成新的不可变状态。

此外,createDraft / finishDraft 也可用于表达对草稿的异步更新:

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)

注意:上述用法属于反模式!应先获取数据再操作 user 草稿。否则异步过程中发生的用户更新将无法被草稿捕获。

注意:finishDraft 的第二个参数可接收 patchListener,用于记录变更补丁,其功能与 produce 类似。

警告:通常我们建议优先使用 produce 而非 createDraft/finishDraft 组合。produce 更不易出错,且能更清晰地区分代码中可变性与不可变性的概念。