【Vue】 使用vuex 封装一个toast 组件

使用vuex进行状态管理,使用css控制toast的显示。

type表示toast中的图标,可以自定义添加多种图标,例子中只设置了normal与success,

通过showToast控制toast的css的fadin和fadeout类,通过css的动画效果实现toast逐渐消失的效果

//toast.components

<template>
  <div class="toast-wrapper" :class="{ 'fadein': showToast,'fadeout': !showToast}">
    <div class="icon" v-if="toastInfo.type!=='normal'" :class="toastInfo.type" >
    </div>
    <div class="message">{{toastInfo.message}}</div>
  </div>
</template>
<script>
import { mapGetters } from 'vuex';
export default {
  name: "Toast",
  data() {
    return {
      message: "",
      type: "normal" // noraml 默认,无图标; success 有图标
    };
  },
   computed:{
        ...mapGetters(['showToast','toastInfo'])
    },
};
</script>

<style lang="less" scoped>
@Medium: PingFangSC-Medium, "Microsoft YaHei";
@Regular: PingFangSC-Regular, "Microsoft YaHei";
@Primary: #ff7400;
.toast-wrapper {
  position: absolute;
  left: 50%;
  top: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  width: 7.07rem;
  height: 5.21rem;
  background: rgba(0, 0, 0, 0.8);
  border-radius: 4px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
    &.fadein {
        opacity: 0.8;
        transition: opacity ease-in 0s;
    }
    &.fadeout {
        opacity: 0;
        transition: all ease-out 0.5s;
    }
    .icon{
        display: block;
    }
    .success{
        width: 1.29rem;
        height: 1.29rem;
        margin-bottom: 0.43rem;
        background: url('../assets/success.png');
        background-size: 1.29rem 1.29rem;
    }
    .message{
        font-family: @Regular;
        font-size: 15px;
        text-align: center;
        color: #fff;
    }
}
</style>

通过vuex管理toast的toastInfo,即message和time以及type

// index.js 
import mutations from './mutations.js';
import actions from './actions.js';
import getters from './getters.js';
   const state = {
    showToast: false,
    toastInfo: {
        type: 'normal',
        meassage: ''
    }
};
export default {
    state,
    getters,
    actions,
    mutations
};

// getter.js
export default {
    showToast: state => state.showToast,
    toastInfo: state => state.toastInfo
};

// actions.js
export default {
    setToast ({ dispatch, commit }, payload) {
        commit('updateToast', true);
        commit('updateToastInfo', payload);
        setTimeout(() => { dispatch('delToast'); }, payload.time);
    },
    delToast ({ commit }) {
        commit('updateToast', false);
    }
};

// mutations.js
export default {
    updateToast (state, params) {
        state.showToast = params;
    },
    updateToastInfo (state, params) {
        state.toastInfo = { ...params };
    }
};

最后在组件里使用, 注意,因为是通过vuex控制toasShow,然后在toasShow为false的时候,toast还有0.5s的时间逐渐隐藏,所以整体展示的时间是settoast中的time时间加0.5s

import { mapGetters, mapActions } from 'vuex';

 methods: {
    ...mapActions([ 'setToast']),
    someMedthod() {
     this.setToast({time: 1500, message: '成功',type: 'success'});
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值