Я использую Vuex, и я создал модуль под названием утверждений, который выглядит следующим образом:
import to from 'await-to-js'
import { functions } from '@/main'
import Vue from 'vue'
const GENERATE_TX_SUCCESS = 'GENERATE_TX_SUCCESS'
const GENERATE_TX_ERROR = 'GENERATE_TX_ERROR'
export default {
state: [ ],
mutations: {
[GENERATE_TX_SUCCESS] (state, generateTxData) {
state.push({ transaction: { ...generateTxData } })
},
[GENERATE_TX_ERROR] (state, generateTxError) {
state.push({ transaction: { ...generateTxError } })
}
},
actions: {
async generateTx ({ commit }, data) {
const [generateTxError, generateTxData] = await to(functions.httpsCallable('generateTx')(data))
if (generateTxError) {
commit(GENERATE_TX_ERROR, generateTxError)
} else {
commit(GENERATE_TX_SUCCESS, generateTxData)
}
}
},
getters: { }
}
Затем в компоненте .vue у меня есть эти часы:
watch: {
claims: {
handler (newTxData, oldTxData) {
console.log(newTxData)
}
}
}
Проблема, с которой я здесь сталкиваюсь, заключается в том, что newTxData - это то же самое, что и oldTxData.
Насколько я понимаю, поскольку это толчок, и он обнаруживает изменение, это не одно из следующих предупреждений: https://vuejs.org/v2/guide/list.html#Caveats
Таким образом, в основном проблема заключается в следующем:
Примечание: при замене (а не замене) объекта или массива старое значение будет таким же, как новое значение, поскольку ониссылаться на тот же объект / массив.Vue не хранит копию значения перед изменением.
https://vuejs.org/v2/api/#vm-watch
Тогда мой вопрос: как мне обойти это в мутации?
Редактировать :
Я пытался также с Vue.set(state, state.length, generateTxData)
, но получил то же поведение.
Редактировать 2 - временное решение - (плохая производительность):
Я адаптирую @ Мэттью (благодаря @Jacob Goh) к моему решению с vuexfire :
computed: {
...mapState({
claims: state => cloneDeep(state.claims)
})
},