@aimwhy/immer
TypeScript icon, indicating that this package has built-in type declarations

0.1.1 • Public • Published

自己实现一个 immer, 满足常规项目要求、代码精简提升效率、源码 66 行

immer 包暴露了一个完成所有工作的默认函数。

produce(currentState, recipe: (draftState) => void): nextState

produce 需要一个 baseState,以及一个可用于对传入的 draft 进行所有所需更改的 recipe

recipe 中,常规的数据操作都可以用在 draft 对象上,包括属性字段分配、删除操作和修改数组,如 push、pop、splice、 delete 等。

例子

import produce from "@aimwhy/immer"

const baseState = [
	{
		title: "Learn TypeScript",
		done: true
	},
	{
		title: "Try Immer",
		done: false
	}
]

const nextState = produce(baseState, draftState => {
	draftState.push({title: "Tweet about it"})
	draftState[1].done = true
})

nextState 对象仅是对 baseState 中所有修改链上的引用进行新的生成。 注意: baseState 的数据也变了,但修改链上引用可能没有变。

baseState.length === 3   // ✔️

nextState.length === 3   // ✔️

baseState !== nextState  // ✔️

nextState[0] === baseState[0]  // ✔️

nextState[1] !== baseState[1]  // ✔️

性能对比

可自行尝试、有惊喜~奥

Package Sidebar

Install

npm i @aimwhy/immer

Weekly Downloads

0

Version

0.1.1

License

MIT

Unpacked Size

11.8 kB

Total Files

10

Last publish

Collaborators

  • aimwhy