Я импортирую массив под названием CHART_CARDS
в компонент Vue. Это предназначено для предоставления начального состояния для другого массива, называемого chartCards
, которое пользователь может изменить.
import { CHART_CARDS } from '~/constants/chartCards'
...
export default {
data(){
return {
chartCards: []
}
},
async created(){
if (this.$auth.user.settings && this.$auth.user.settings.length) {
this.chartCards = this.$auth.user.settings
} else {
this.chartCards = CHART_CARDS
}
}
}
Таким образом, свойство данных chartCards берется либо из импортированной переменной, либо из уже существующей таблицы базы данных.
Вот где все становится странно: у меня есть метод под названием reset, который должен восстановить переменную chartCards до значения импортированного массива:
async reset () {
console.log('going to reset. CHART_CARDS looks like:')
console.log(CHART_CARDS)
this.chartCards = CHART_CARDS
await this.updateCards()
console.log('chart cards after updating:')
console.log(this.chartCards)
}
Каким-то образом CHART_CARDS
также изменяется при обновлении chartCards
. В двух журналах консоли выше печатается один и тот же массив, поэтому сброс не работает. CHART_CARDS
больше нигде в коде не изменяется; все ссылки на CHART_CARDS
показаны в приведенном выше коде. Как обновляется его стоимость?
1 ответ
Как уже упоминалось в комментариях, ваш массив CHART_CARDS
, вероятно, содержит объекты, и вы, скорее всего, изменяете эти объекты где-то в своем коде.
Есть простой способ обойти это с помощью некоторых незначительных настроек API.
~ / constants / chartCards.js
export function getChartCards () {
return [
{...},
{...},
...
]
}
< Сильный > App.vue
import { getChartCards } from '~/constants/chartCards'
...
export default {
data(){
return {
chartCards: []
}
},
async created(){
if (this.$auth.user.settings && this.$auth.user.settings.length) {
this.chartCards = this.$auth.user.settings
} else {
this.chartCards = getChartCards()
}
}
}
Поскольку мы всегда создаем новый массив с разными объектами, изменения, внесенные в один экземпляр chartCards
, не отразятся в другом.
Если вы абсолютно хотите придерживаться вашего текущего API, то этого тоже можно достичь. Вам просто нужно создать глубокую копию вашего объекта CHART_CARDS
перед его назначением.
import { CHART_CARDS } from '~/constants/chartCards'
...
export default {
data(){
return {
chartCards: []
}
},
async created(){
if (this.$auth.user.settings && this.$auth.user.settings.length) {
this.chartCards = this.$auth.user.settings
} else {
this.chartCards = JSON.parse(JSON.stringify(CHART_CARDS)) // This will not work if your CHART_CARDS has methods
}
}
}
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.