【问题标题】:Mobx-state-tree Clone also changes the original item?Mobx-state-tree Clone 也改变了原来的item?
【发布时间】:2019-03-10 14:34:08
【问题描述】:

我有以下型号sn-p:

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

【问题讨论】:

标签: mobx-react mobx-state-tree


【解决方案1】:

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 }));

【讨论】:

  • 嗯,你的最后一个建议不起作用,我做什么:getSnapshot(self.node).id = 123,结果是:无法分配给对象'#的只读属性'id' '。知道出了什么问题吗?
  • getSnapshot 会生成一个冻结对象,因此不要直接更改它,而是创建一个新对象:Object.assign({}, getSnapshot(node), { id: 'new id })
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2021-04-27
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多