vue:toast组件的设计与优化


一、前言

上一篇文章讲到了toast组件的样式以及淡入、淡出的过渡动画设计。这篇文章主要讲解如何根据不同的需求展示不同的弹框组件。


二、需求分析

我希望不同的用户处理显示不同的弹框消息和图标,因此我设计了一个msg值传入弹框消息,type值绑定iconfont图标,以此来实现我的需求。

三、步骤

1.tosat组件的template

type值分为3个,success表示消息发送成功,warning表示警告,danger表示消息发送失败。代码如下:

<template>
  <div class="toast fade">
    <i class="iconfont" :class="type==='success'?'icon-toast_chenggong':type==='danger'?'icon-toast-shibai_huaban':'icon-toast-jinggao'"></i>
    <span>{{msg}}</span>
  </div>
</template>

2.在需要的地方传入msg和type值

首先进行引入:

import { mapMutations,mapState,mapActions} from 'vuex'

调用:

this.asyncChanIsshowToast({
      msg:"登录成功",
      type:"success"
      }) 

3.代码优化及复用

为了防止每次需要调用函数的地方都要开启、关闭toast组件,导致代码十分冗长,这里将函数在上一篇中开启和关闭简单调用抽取成了vuex中的异步函数asyncChanIsshowToast,代码如下:

export default {
  namespaced: true,
  state: {
    isshowToast: false,
    msg: "",
    type: ""
  },
  getters: {
  },
  mutations: {
    chanIsshowToast(state, payload) {
      state.isshowToast = payload.isShow,
        state.msg = payload.msg,
        state.type = payload.type
    }
  },
  actions: {
    asyncChanIsshowToast({ commit }, payload) {
      //开启
      commit('chanIsshowToast', {
        isShow: true,
        msg: payload.msg,
        type: payload.type
      })
      //关闭
      setTimeout(() => {
        commit('chanIsshowToast', {
          isShow: false,
          msg: payload.msg,
          type: payload.type
        })
      }, 2000)
    }
  },
  modules: {
  }
}


setTimeout()作为异步函数只能放在actions中,且要通过commit()触发mutations中的方法来修改state。这里把之间的isShow布尔值也一同放进了vuex,这样就不需要在调用时每次手动传入isShow布尔值了。

4.在组件内部调用代码

在组件内部调用代码比较简单:

import { mapMutations,mapActions } from 'vuex'
...
...mapActions({
  asyncChanIsshowToast:"ToastStatus/asyncChanIsshowToast"
    })
...
this.asyncChanIsshowToast({
        msg:"请输入短信验证码",
        type:"warning"
      }) 

5.在组件外部(拦截器)调用代码

因为拦截器不在组件内部,所以不能用this方式调用,需要引入store并运用store.dispatch方法书写如下代码:

import axios from "axios"
import store from "@/store"

//创建axios实例(instance)
const instance = axios.create({
  baseURL: "http://kumanxuan1.f3322.net:8881/cms",
  timeout: 5000
  //如果5s后未响应,就通知用户页面存在加载错误
})

//请求拦截器
instance.interceptors.request.use(config => {
  //什么时候执行这个函数?-发送请求之前
  //cofig是什么?-记录了本次请求相关信息的一个对象
  //这个函数能用来做什么?-做一些请求前可进行的操作(如添加请求头、获取token)
  console.log("执行了请求拦截器", config);
  return config
}, err => {
  return Promise.reject(err)
});

//响应拦截器
instance.interceptors.response.use(res => {
  //什么时候执行这个函数?-在接收到后端服务器的相应之后,进入到组件内部的then方法之前执行这里的代码
  //res是什么?-记是axios封装好的一个响应对象
  //这个函数能用来做什么?-做一些统一的数据处理
  let res_data = res.data;
  if (res_data.code != 0) {
    store.dispatch("ToastStatus/asyncChanIsshowToast", {
      //因为是模块化的,所以要写文件夹名称/函数名
      msg: res_data.message,
      type: "danger"
    })

    return false
  }
  console.log("执行响应拦截器", res);
  return res_data//return后的值被组件中的请求的then方法的res接收
}, err => {
  //相当于在组件中,发送请求之后的catch方法
  store.dispatch("ToastStatus/asyncChanIsshowToast", {
    msg: err,
    type: "danger"
  })
  return Promise.reject(err)
  //直接抛出异常,看见红色警告
});

//导出
export default instance

四、总结

本文主要介绍了如何根据不同的需求展示不同的弹框组件,关于弹框的部分就正式完成了。

在这两篇关于弹框的文章中,我们一共完成了这些内容:
1)设计了组件结构样式;
2)将显示和隐藏的变量(isShowToast)放在了vuex中;
3)用transition过渡组件设计了淡入及淡出的效果(在vue中,设计过渡方式就使用加类名的方式,vant会有不同);
4)设计传入msg和type值,方便每次调用时传入文本和图标;
5)定时器隐藏Toast组件;
6)把定时器抽取到actions方法中;
7)两种调用Toast组件的方式。

下一篇将讲解通过二维码扫描实现微信登录该如何设计~今天的复盘就到此结束啦!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TeresaPeng_zju

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值