Mobx-state-tree Clone是否也更改了原始项目?

时间:2019-03-10 14:34:08

标签: mobx-react mobx-state-tree

我有以下模型片段:

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应该包含原始名称。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

types.reference is tied to types.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 }));