Я сделал это, используя комбинацию глобальных компонентов и Vuex. Ответ немного длинен, потому что я привожу пример вместе с описанием, пожалуйста, потерпите меня:)
Сначала я создаю закусочную с color
и text
в качестве state
и setSnackbar()
action
, который получает цвет и текст в качестве параметров. Затем вы можете создать свой Snackbar
компонент и не забудьте указать в нем свои методы получения, действия. Фрагмент кода:
// snackbar component
<template>
<v-snackbar v-model="snackbar.show" :color="snackbar.color" :timeout="6000" bottom right>
{{ snackbar.text }}
<v-btn dark text @click="snackbarClosed()">Close</v-btn>
</v-snackbar>
</template>
<script lang="ts">
import Vue from "vue";
import { mapGetters, mapActions } from "vuex";
export default Vue.extend({
computed: {
...mapGetters(["snackbar"])
},
methods: {
snackbarClosed() {
this.resetSnackbar();
},
...mapActions(["resetSnackbar"])
}
});
</script>
// snackbar store
const state = {
snackbar: {
show: false,
text: '',
color: ''
}
};
const getters = {
snackbar: (state: any) => state.snackbar
};
const actions = {
async setSnackbar({ commit }, params) {
commit('updateSnackbar', Object.assign({}, { show: true }, params))
},
async resetSnackbar({ commit }) {
const setting: SnackbarSetting = {
show: false,
text: '',
color: ''
};
commit('updateSnackbar', setting)
};
const mutations = {
updateSnackbar: (state: any, snackbar: SnackbarSetting) => {
state.show = snackbar.show;
state.text = snackbar.text;
state.color = snackbar.color;
}
};
Чтобы сделать компонент Snackbar
глобально доступным, импортируйте компонент Snackbar
в main.ts
и добавьте строку Vue.component('Snackbar', Snackbar);
перед new Vue
. Его целью является глобальная регистрация компонента Snackbar
перед инициализацией экземпляра Vue. Пример:
// main.ts
import Snackbar from './components/Snackbar.vue';
Vue.component('Snackbar', Snackbar);
new Vue({
...
Прежде чем вы захотите отобразить свою закусочную в приложении, по моей рекомендации вы должны поместить <Snackbar />
в App.vue
, чтобы эта закусочная могла появляться перед вашими компонентами, и вы не будете быть лицом к отсутствующей закусочной при переключении между компонентами.
Если вы хотите отобразить снэк-бар, просто сделайте это в своем компоненте:
// any of your component
methods: {
someEvent() {
this.someApiCall({
// some data passing
}).then(() => {
this.setSnackbar({
text: 'Data has been updated.',
color: 'success'
});
}).catch(() => {
this.setSnackbar({
text: 'Failed to update data.',
color: 'error'
});
});
},
...mapActions(['setSnackbar'])
}
Надеюсь, вы сможете решить эту проблему, пожалуйста, не стесняйтесь, дайте мне знать, если вам что-то нужно. Вот некоторые дополнительные материалы для вас: Глобальная регистрация компонентов