Другое решение заключается в использовании _.deepCopy из библиотеки Lodash. Он более универсален, чем оператор распространения, поскольку он будет рекурсивно идти по всему дереву, а не на один уровень. Это полезно для больших деревьев, так что вам не нужно удваивать, увеличивать или увеличивать в четыре или четыре раза, и иметь трудно читаемый код.
Вот как вы будете использовать его с простым хранилищем дерева состояний mobx. Это очень элегантно, легко в использовании.
Имейте в виду: это рекурсивная функция передачи по копированию, поэтому производительность может быть плохой, если объект слишком велик.
import _ from 'lodash';
import { types, getRoot, destroy, flow } from "mobx-state-tree";
const SearchModel = types
.model({
results: types.array(ItemModel, []),
selectedItem:types.maybeNull(ItemModel,{ id: 0 })
})
.actions(self => ({
setSelectedItem(selItem) {
self.selectedItem = _.deepCopy(selItem);
}
}));
export default SearchModel;