Старый и новый на часах, кажется, не работает
Я работаю над алгоритмом динамической загрузки данных, в котором есть переменная состояния (VueX) loadState
который управляет статусом данных, загружается ли он /loadinDone
loadState: {
filters:"LOADING_DONE"
criteria:"LOADING"
otherDependency:"LOADING_DONE"
}
есть watch
на loadState
,
...
computed: {
...mapGetters([
'loadState',
'project'
])
}
...
watch: {
loadState: {
deep: true,
handler: function (newValue, oldValue) {
Object.keys(newValue).forEach((key) => {
console.log(key, " : " ,newValue[key], oldValue[key])
});
}
}
}
это всегда такие же значения, как, filters: LOADIN_DONE LOADING_DONE
Это моя мутация для обновления состояния загрузки,
mutations: {
[UPDATE_LOAD_STATE]: function (state, payload) {
let temp = state.loadState;
temp[payload.name] = payload.state;
Vue.set(state, 'loadState', temp);
// Vue.set(state.loadState, payload.name, payload.state);
}
}
Я также взял ссылку с: https://github.com/vuejs/vue/issues/1086
Но это не работает.
Я не понимаю, как я могу решить это.
Есть ли лучший способ сделать ожидающие вызовы после загрузки всех зависимостей, мы делаем определенный вызов данных.
Я знаю подход,
<div v-if="isFilterLoaded"></div>
но в Моем вызове мои зависимости могут быть динамическими, это может происходить из базы данных
2 ответа
Попробуйте поменять весь объект на новый.
mutations: {
[UPDATE_LOAD_STATE]: function (state, {name, state}) {
this.loadState = Object.assign({}, state.loadState, {[name]: state});
}
}
Из предупреждения в Vue Docs для наблюдателя:
Примечание: при замене (а не замене) объекта или массива старое значение будет совпадать с новым значением, поскольку они ссылаются на один и тот же объект / массив. Vue не хранит копию значения перед изменением.
Таким образом, вы должны справиться с этим самостоятельно, сохранив копию oldValue
в свойстве данных как:
data() {
oldLoadState: null
}
...
computed: {
...mapGetters([
'loadState',
'project'
])
}
...
created(){
this.oldLoadState = this.loadState;
}
...
watch: {
loadState: {
deep: true,
handler: function (newValue, oldValue) {
Object.keys(newValue).forEach((key) => {
console.log(key, " : " ,newValue[key], this.oldLoadState)
});
this.oldLoadState = newValue[key];
}
}
}
мы сохраняем первоначальное значение
loadState
в свойстве данныхoldLoadState
ссылаться на это свойство данных
oldLoadState
в вашем наблюдателе, чтобы получить значениеloadState
до мутацииустановить
oldLoadState
для наблюдателяnewValue
сохранить предыдущее значение сохраненным