Vue.jsでちょこっとプログラムを書いていてハマったので備忘として記事にします。
やりたかったこと
複製したオブジェクトを配列に詰め込んで、後からそれぞれのオブジェクトを変更したかったのです。
例えば、配列order
にオブジェクトorderDetails
を複数追加してしまうと、追加したうち1つを更新すると、追加したすべてのorderDetails
が同じように更新されてしまいます。
import { createStore } from 'vuex'
export default createStore({
state: {
count: 3,
order: [],
outletDetails: {
id: null,
device: 'iPad'
}
},
getters: {
},
mutations: {
generate(state){
for (let index = 0; index < state.count; index++) {
state.order.push(state.outletDetails)
}
}
},
actions: {
generate({ commit }) {
commit('generate')
}
},
modules: {
}
})
上記の例で言うと、アクションgenerate
を実行すると、outletDetails
を複製して3つ追加したつもりでしたが、実際にはoutletDetails
を参照するエイリアスのようなものを3つ作ってしまったのでした。
解決策
一度JSONにしたオブジェクトoutletDetails
を、JSONにパースして追加していったら、それぞれ独立したオブジェクトになった。
import { createStore } from 'vuex'
export default createStore({
state: {
count: 3,
order: [],
outletDetails: {
id: null,
device: 'iPad'
}
},
getters: {
},
mutations: {
generate(state){
for (let index = 0; index < state.count; index++) {
state.order.push(JSON.parse(JSON.stringify(state.outletDetails)))
}
}
},
actions: {
generate({ commit }) {
commit('generate')
}
},
modules: {
}
})
終わりに
今回は、一度JSONにする作戦で対応したけど、もっとスマートなやり方があれば知りたいです。
コメント