Mobx-state-tree Clone还会更改原始项目?

问题描述 投票:1回答:1

我有以下模型片段:

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

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

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

在我的render方法中,编辑节点的使用方式如下:

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

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

mobx-react mobx-state-tree
1个回答
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 }));
© www.soinside.com 2019 - 2024. All rights reserved.