Mobx-state-tree Clone 也改变了原来的项目?

Mobx-state-tree Clone also changes the original item?

我有以下模型片段:

nodeOrigin: types.maybe(types.reference(nodeState)),
node: types.maybe(nodeState),

然后我开始通过以下函数编辑节点(我保存的原始节点可以在 undo() 函数中使用):

startEditing(node) {
    self.nodeOrigin = node;
    self.node = clone(node);
}

在我的渲染方法中,编辑节点是这样使用的:

<form className="form">
     <TextField margin='dense' value={getStore().node["name"]} />
</form>

但是当我更改名称并打印节点和原始节点的内容时,它们都具有更改后的名称。 NodeOriginal 应包含原始名称。我做错了什么?

types.referenceis tied totypes.identifier。您可能在这里误解的是 types.reference 引用给定节点的 types.identifier 属性 而不是节点本身。

当您 clone 时,您不会更改原始节点的 idtypes.reference 由给定的 id 从标识符缓存中即时解析,因此 它将 始终引用具有给定 id 的节点。

此外,鉴于 id 在初始化后不能更改并且它在整个节点树中应该是唯一的,我得出结论具有 types.identifier 属性 的节点不应该被克隆使用 clone 实用程序。

或者,您可以拍摄要克隆的节点的快照,手动更新 types.identifier 属性 并从中创建一个新节点。类似于:

const cloneWithNewId = (node, id) =>
      getType(node).create(Object.assign({}, getSnapshot(node), { id }));