Есть много более чистых способов сделать это.
Прежде всего, если вы используете Nuxt, то, IMO, вы должны использовать его удивительную особенность middlewares для диспетчеризации действий (ваш сценарий использования не хранить его на уровне компонентов).
Во-вторых, Vuex предоставляет нам mapGetters
функциональность, которая делает свойства состояния доступными в компонентах, в то же время поддерживая их реактивность, в то же время.
Итак, вы можете пойти со следующим:
Магазин Vuex:
export const state = () => ({
section: 0,
notifications: ["notification 1", "notification 2", "notification 3"]
});
export const mutations = {
INC_SECTION(state) {
state.section++;
},
RESET_SECTION(state) {
state.section = 0;
}
};
export const actions = {
rotate({ commit, dispatch, state }) {
setTimeout(() => {
let total = state.notifications.length - 1;
if (state.section === total) {
commit("RESET_SECTION");
} else {
commit("INC_SECTION");
}
dispatch("rotate");
}, 3500);
}
};
export const getters = {
notifications(state) {
return state.notifications;
},
section(state) {
return state.section;
}
};
export default {
state,
mutations,
actions,
getters
};
Vue Компонент:
<template>
<section class="notifications">
<template v-for="(notification, i) in notifications">
<p v-if="section === i" :key="i">{{ notification }}</p>
</template>
</section>
</template>
<script>
import { mapGetters } from "vuex";
export default {
data() {
return {};
},
computed: {
...mapGetters(["notifications", "section"])
}
};
</script>
Middleware
export default function({ store }) {
store.dispatch("rotate");
}
В зависимости от вашего варианта использования вы можете оставить это промежуточное ПО глобальным (привязанным к маршрутам) или прикрепленным к определенному макету.
вот рабочий песочница пример. надеюсь, это поможет вам.