Mutative

共享引用

多条路径指向同一对象时的草稿行为,以及如何保留共享关系。

Mutative 支持从根节点到同一节点存在多条路径的结构,即含共享节点的有向无环图(DAG),但不能包含循环引用。需要理解草稿处理共享引用时的以下行为。

多条路径使用独立草稿

基础状态的多条路径引用同一对象时,Mutative 会为每条路径创建独立草稿。修改一条路径不会自动反映到其他路径。

import { create } from 'mutative';

const obj = {};
// Same object referenced by two keys
obj.color1 = obj.color2 = { name: 'Red' };

const result = create(obj, (draft) => {
  // ⚠️ Different drafts created for each path!
  console.log(draft.color1 === draft.color2); // false

  draft.color1.name = 'Blue';

  // color2 remains unchanged because it has a separate draft
  console.log(draft.color2.name); // 'Red'
});

console.log(result.color1 === result.color2); // false
// Result: { color1: { name: 'Blue' }, color2: { name: 'Red' } }

这是有意设计的行为,与 Immer 一致。状态树中的每条路径都有独立的草稿代理。

创建共享引用

若需在结果状态中保留或创建共享引用,必须在更新函数中显式将一个草稿赋给另一个位置。

const result = create(obj, (draft) => {
  draft.color1.name = 'Blue';

  // ✅ Explicitly share the reference
  draft.color2 = draft.color1;
});

// Now they share the same reference in the result
console.log(result.color1 === result.color2); // true
// Result: { color1: { name: 'Blue' }, color2: { name: 'Blue' } }

行为汇总

场景行为
基础状态中的共享节点每条路径有独立草稿,一条路径的修改不会反映到其他路径。
手动赋值的引用✅ 支持。draft.x = draft.y 在最终状态中创建共享引用。
真正的循环引用❌ 不支持。开发环境开启自动冻结时会主动检测。
在 GitHub 上编辑

最后更新于 作者:unadlib

本页内容