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.reference
is tied totypes.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 }));
我有以下模型片段:
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.reference
is tied totypes.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 }));