У меня есть следующий компонент, где у меня есть вычисляемое свойство theme
. Функция set
вычисляемого свойства выполняет действие Vuex с именем setTheme
, которое возвращает обещание, а также обновляет свойство theme
в состоянии Vuex.
<template>
<div>
<input id="light-theme-radio" v-model="theme" type="radio" value="light">
<label for="light-theme-radio">Light</label>
<input id="dark-theme-radio" v-model="theme" type="radio" value="dark">
<label for="dark-theme-radio">Dark</label>
</div>
</template>
<script>
import Vue from "vue";
import { createNamespacedHelpers } from "vuex";
const { mapActions } = createNamespacedHelpers("theme");
export default {
computed: {
theme: {
get() {
return this.$store.state.theme.theme;
},
set(value) {
this.setTheme(value);
}
}
},
methods: {
...mapActions(["setTheme"])
}
};
</script>
Проблема в том, что вычисляемое свойство theme.get
не вызывается после завершения setTheme
для обновления переключателей с новым выбранным элементом. Как лучше обойти эту проблему при использовании асинхронных сеттеров. Вот как выглядит мой Vuex:
export const state = {
theme: "light"
};
export const mutations = {
theme: (s, p) => (s.theme = p)
};
export const actions: ActionTree = {
async setTheme(context, theme) {
context.commit("theme/theme", theme);
// ...omitted
await Timer.delay(750);
// ...omitted
}
};
const mainModule = {
actions,
getters,
mutations,
namespaced: true,
state
};
export default mainModule;
const modules = {
other: otherModule,
theme: themeModule
};
const store = new Store({
modules,
});
export default store;