(转)vuex 封装设计全局可用的vuetify中的snackbar

本文介绍如何在Vuetify中封装snackbar组件,并利用Vuex实现全局消息提示。通过创建store模块和组件,可以方便地在应用任何位置调用dispatch触发snackbar显示,提供成功、警告等不同类型的反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vuetify中的 snackbar 类似element 中的message消息提示,实现 成功、警告、消息等消息反馈。

vuetify的snackbar 需要自行设置:

将vuetify snackbar进行封装,用vuex 来传递消息内容。

建立 store/modules/snackbar.js,管理 snackbar 的变量。

/**
 * @param msg 信息
 * @param color snackbar 颜色
 * @param visible 是否可见
 * @param showClose 关闭按钮
 * @param timeout 停留持续时间 
 */
const snackbar = {
  // 
  namespaced: true,
  state: {
    msg: '',
    color: '',
    visible: false,
    showClose: true,
    timeout: 5000,

  }, 
  // 逻辑处理,同步函数
  mutations: {
    OPEN_SNACKBAR(state, options) {
      state.visible = true
      state.msg = options.msg
      state.color = options.color
    },
    CLOSE_SNACKBAR(state) {
      state.visible = false

    },
    setShowClose(state, isShow) {
      state.showClose = isShow
    },
    setTimeout(state, timeout) {
      state.timeout = timeout
    },
  },
  // 逻辑处理,异步函数
  actions :{
    openSnackbar (context,options){
      let timeout = context.state.timeout
      context.commit('OPEN_SNACKBAR',{
        msg:options.msg,
        color:options.color
      })
      setTimeout(()=>{
        context.commit('CLOSE_SNACKBAR')
      },timeout)
    }
  }
}
export default snackbar;

在vuex的index 中引入这个模块:

import Vue from "vue";
import Vuex from "vuex";
// 放置全局信息
Vue.use(Vuex);

import snackbar from "@/store/modules/snackbar";
export default new Vuex.Store({
  modules: {
    snackbar,
  },
});

再在components中建立snackbar组件:

<template>
  <v-snackbar top text v-model="visible" :color="color">
    {{ this.$store.state.snackbar.msg }}
    <!-- 关闭按钮 -->
    <template v-slot:action="{ attrs }" >
      <v-btn v-bind="attrs" v-if="showClose" icon @click="close" :color="color"
        ><v-icon>mdi-close</v-icon>
      </v-btn>
    </template>
  </v-snackbar>
</template>
<script>
export default {
  data() {
    return {};
  },
  computed: {
    visible() {
      return this.$store.state.snackbar.visible;
    },
    showClose() {
      return this.$store.state.snackbar.showClose;
    },
    color() {
      return this.$store.state.snackbar.color;
    },
  },
  methods: {
    close() {
      this.$store.commit("snackbar/CLOSE_SNACKBAR");
    },
  },
};
</script>

最后在App.vue中引入snackbar组件

<template>
  <div id="app">
    <v-app>
      <router-view />
      <Snackbar />
    </v-app>
  </div>
</template>
<script>
import Snackbar from '@/components/_partial/Snackbar.vue'
export default {
  components:{
    Snackbar
  },
}
</script>

由于vuex的全局属性,所以你可以在页面的任何地方调用dispatch来创建消息条的实例:

methods:{
    createdSnackbar(){
      this.$store.dispatch('snackbar/openSnackbar',{
        msg:'瓦拉伊利五路',
        color:'primary'
      })
    }
  }

原文地址: https://zhuanlan.zhihu.com/p/269245401

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值