Javascript Vuex存储,为什么添加到数组会用最后一个条目覆盖存储中的所有值?

Javascript Vuex存储,为什么添加到数组会用最后一个条目覆盖存储中的所有值?,javascript,vue.js,vuejs2,vuex,vuex-modules,Javascript,Vue.js,Vuejs2,Vuex,Vuex Modules,我正在使用vuex typescript。这是一个存储模块: import { getStoreAccessors } from "vuex-typescript"; import Vue from "vue"; import store from "../../store"; import { ActionContext } from "vuex"; class State { history: Array<object>; } const state: State = {

我正在使用vuex typescript。这是一个存储模块:

import { getStoreAccessors } from "vuex-typescript";
import Vue from "vue";
import store from "../../store";
import { ActionContext } from "vuex";
class State {
  history: Array<object>;
}

const state: State = {
  history: [],
};

export const history_ = {
  namespaced: true,
  getters: {

    history: (state: State) => {

      return state.history;
    },

  },
  mutations: {

    addToHistory (state: State, someob: any) {

      state.history.push(someob);

    },

    resetState: (s: State) => {
      const initial = state;
      Object.keys(initial).forEach(key => { s[key] = initial[key]; });
    },
  },

  actions: {
    addToHistory(context: ActionContext<State, any>, someob: any) {
      commitAddToHistory(store, someob);
    }

  }

const { commit, read, dispatch } =
  getStoreAccessors<State, any>("history_");
const mutations = history_.mutations;
const getters = history_.getters;
const actions = history_.actions;

export const commitResetState = commit(mutations.resetState);
export const commitAddToHistory = commit(mutations.addToHistory);
export const getHistory = read(getters.history);
export const dispatchAddToSearchHistory = dispatch(actions.addToHistory);
现在,当我添加另一个对象时,
{b:2}
存储变成

store = [
  {
    b: 2
  },
  {
    b: 2
  }
]
所有值都由最后一个条目写入。例如,如果我尝试添加
{c:3}
,则存储看起来像(依此类推):


……嗯,嗯,我想你可能每次都发送相同的对象

请试试这个变种

addToHistory (state: State, someob: any) {
  state.history.push({...someob});
},
还是这个动作

addToHistory(context: ActionContext<State, any>, someob: any) {
  commitAddToHistory(store, {...someob});
}
addToHistory(上下文:ActionContext,someob:any){
提交历史(存储,{…someob});
}

这将使用“扩展”操作符克隆对象。这样,您添加的每个项目都将成为新对象。

…嗯,我想您每次都可能发送相同的对象

请试试这个变种

addToHistory (state: State, someob: any) {
  state.history.push({...someob});
},
还是这个动作

addToHistory(context: ActionContext<State, any>, someob: any) {
  commitAddToHistory(store, {...someob});
}
addToHistory(上下文:ActionContext,someob:any){
提交历史(存储,{…someob});
}

这将使用“扩展”操作符克隆对象。这样,您添加的每一项都将成为新对象。

我看到唯一奇怪的是,您在
历史对象上定义了
状态
,它看起来似乎从未作为
历史对象的属性添加。在中,
状态
存储对象上定义。你能试着在对象上定义它,看看它是否改变了什么吗?我真的复制粘贴了那个逻辑,但仍然得到了同样的结果。这是令人沮丧的。我看到的唯一奇怪的事情是,您在
历史
对象中定义了
状态
,它看起来似乎从未作为
历史
的属性添加。在中,
状态
存储对象上定义。你能试着在对象上定义它,看看它是否改变了什么吗?我真的复制粘贴了那个逻辑,但仍然得到了同样的结果。这太令人沮丧了。这很有效,你到底做了什么?这{…someob}意味着什么?它被称为扩展运算符,它是es6特性;类似于
Object.assign(…)
他们创建一个对象的副本,这确保您添加了一个新对象,而不是同一对象的一个新实例。这正在工作,您做了什么?这{…someob}意味着什么?它被称为扩展运算符,它是es6特性;类似于
Object.assign(…)
它们创建一个对象的副本,这确保您添加了一个新对象,而不是同一对象的新实例