编程语言
首页 > 编程语言> > javascript – 如何深度克隆状态并在Vuex中回滚?

javascript – 如何深度克隆状态并在Vuex中回滚?

作者:互联网

在Vuex中,我想在树中对对象属性进行快照/克隆,修改它,然后可能回滚到以前的快照.

背景:
在应用程序中,用户可以在应用之前尝试某些更改.应用更改时,它们应该影响主vuex树.用户还可以单击“取消”以放弃更改并返回到前一状态.

例:

state: {
  tryout: {},
  animals: [
    dogs: [
      { breed: 'poodle' },
      { breed: 'dachshund' },
    ]
  ]
}

用户进入»试用«模式,将一个品种从贵宾犬改为奇瓦瓦.然后,她决定放弃更改或应用它们.

state: {
  animals: [
    dogs: [
      { breed: 'poodle' },
      { breed: 'dachshund' },
    ]
  ],
  tryout: {
    animals: [
      dogs: [
        { breed: 'chihuahua' },
        { breed: 'dachshund' },
      ]
    ]
  }
}

丢弃(回滚到以前的状态):

state: {
  animals: [
    dogs: [
      { breed: 'poodle' },
      { breed: 'dachshund' },
    ]
  ],
  tryout: {}
}

应用(保存主vuex树中的更改):

state: {
  animals: [
    dogs: [
      { breed: 'chihuahua' },
      { breed: 'dachshund' },
    ]
  ],
  tryout: {}
}

什么是深度克隆状态,对克隆进行更改以及稍后放弃更改或应用它们的好解决方案?
这里的示例非常基础,解决方案必须适用于更复杂的对象/树.

编辑1:
有一个名为vuex-undo-redo的库,它基本上记录了突变,但有一些问题.在另一个Stack Overflow主题Going back to States like Undo Redo on Vue.js vuex中,建议使用vuex函数replaceState(state).

解决方法:

您可以将JSON.stringify和JSON.parse与replaceState一起使用.

在vuex中:

const undoStates = [];

// save state
undoStates.push(JSON.stringify(state));

// call state (remove from stack)
if (undoStates.length > 0) {
  this.replaceState(JSON.parse(undoStates.pop()));
}

这将创建整个州的副本,但您也可以使用商店的一部分:

const animalStates = [];

// save state
animalStates.push(JSON.stringify(state.animals));

// call state (remove from stack)
if (animalStates.length > 0) {
  let animals = JSON.parse(animalStates.pop());
  this.replaceState({...state, animals} );
}

这会将当前状态与您选择的对象合并(在本例中为动物).

标签:javascript,clone,deep-copy,vue-js,vuex
来源: https://codeday.me/bug/20190705/1387731.html