1

我有以下模型片段:

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

4

1 回答 1

1

types.reference 绑定到 types.identifier。您可能在这里误解的是,它types.reference引用了types.identifier给定节点的属性,而不是节点本身。

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

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

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

const cloneWithNewId = (node, id) =>
      getType(node).create(Object.assign({}, getSnapshot(node), { id }));
于 2019-03-14T09:01:15.150 回答