Vue全局loading及错误提示的思路与实现


Posted in Javascript onAugust 09, 2019

前言

近期项目马上上线,前两天产品提个需求,加个全局loading,我这半路出家的vue选手,有点懵逼,这玩意还是第一次,但是作为一个初级的前端切图仔,这个东西是必须会的,花了五分钟思考了一下,然后动键盘码出来 ,今天总结一下,与各位分享交流,有错误还请各位指出。

思路

我们项目请求使用的是axios,那么我们就在请求前后进行拦截,添加我们需要的东西,然后通信控制loading,通信方式我就不写了,有个老哥写的不错,可以去看看传送门

代码实现

首先对axios进行封装 如果你想进行全局错误提醒 也可以在拦截的代码进行操作 具体代码看下面

/**
 * axios 配置模块
 * @module config
 * @see utils/request
*/

/**
 * axios具体配置对象
 * @description 包含了基础路径/请求前后对数据对处理,自定义请求头的设置等
 */
const axiosConfig = {
 baseURL: process.env.RESTAPI_PREFIX,
 // 请求前的数据处理
 // transformRequest: [function (data) {
 // return data
 // }],
 // 请求后的数据处理
 // transformResponse: [function (data) {
 // return data
 // }],
 // 自定义的请求头
 // headers: {
 // 'Content-Type': 'application/json'
 // },
 // 查询对象序列化函数
 // paramsSerializer: function (params) {
 // return qs.stringify(params)
 // },
 // 超时设置s
 timeout: 10000,
 // 跨域是否带Token 项目中加上会出错
 // withCredentials: true,
 // 自定义请求处理
 // adapter: function(resolve, reject, config) {},
 // 响应的数据格式 json / blob /document /arraybuffer / text / stream
 responseType: 'json',
 // xsrf 设置
 xsrfCookieName: 'XSRF-TOKEN',
 xsrfHeaderName: 'X-XSRF-TOKEN',
 // 下传和下载进度回调
 onUploadProgress: function (progressEvent) {
 Math.round(progressEvent.loaded * 100 / progressEvent.total)
 },
 onDownloadProgress: function (progressEvent) {
 Math.round(progressEvent.loaded * 100 / progressEvent.total)
 },
 // 最多转发数,用于node.js
 maxRedirects: 5,
 // 最大响应数据大小
 maxContentLength: 2000,
 // 自定义错误状态码范围
 validateStatus: function (status) {
 return status >= 200 && status < 300
 }
 // 用于node.js
 // httpAgent: new http.Agent({ keepAlive: true }),
 // httpsAgent: new https.Agent({ keepAlive: true })
}
/** 导出配置模块 */
export default axiosConfig

开始构建请求对象

const request = axios.create(config)

请求之前拦截

// 请求拦截器
request.interceptors.request.use(
 config => {
 // 触发loading效果
 store.dispatch('SetLoding', true)
 return config
 },
 error => {
 return Promise.reject(error)
 }
)

请求后拦截

// 返回状态判断(添加响应拦截器)
request.interceptors.response.use(

 (res) => {
 // 加载loading
 store.dispatch('SetLoding', false)
 // 如果数据请求失败
 let message = ''
 let prefix = res.config.method !== 'get' ? '操作失败:' : '请求失败:'
 switch (code) {
  case 400: message = prefix + '请求参数缺失'; break
  case 401: message = prefix + '认证未通过'; break
  case 404: message = prefix + '此数据不存在'; break
  case 406: message = prefix + '条件不满足'; break
  default: message = prefix + '服务器出错了'; break
 }
 let error = new Error(message)

 if (tip) {
  errorTip(vueInstance, error, message)
 }
 let result = { ...res.data, error: error }
 return result
 },
 (error, a, b) => {
 store.dispatch('SetLoding', false)
 process.env.NODE_ENV !== 'production' && console.log(error)
 return { data: null, code: 500, error: error }
 }
)

通信

我这边通信用的是Vuex,其他方式类似

state: {
 loading: 0
 },
 mutations: {
 SET_LOADING: (state, loading) => {
  loading ? ++state.loading : --state.loading
 },
 CLEAN_LOADING: (state) => {
  state.loading = 0
 }
 },
 actions: {
 SetLoding ({ commit }, boolean) {
  commit('SET_LOADING', boolean)
 },
 CLEANLOADING ({commit}) {
  commit('CLEAN_LOADING')
 }
 },
 getters: {
 loading (state) {
  return state.loading
 }
 }

state采用计数方式能够避免一个页面可能同时有多个ajax请求,导致loading闪现多次,这样就会在所有ajax都结束后才隐藏loading,不过有个很重要的地方需要注意,每一个路由跳转时无论ajax是否结束,都必须把state的值设置为0,具体下面的代码

router.beforeEach((to, from, next) => {
 store.dispatch('CLEANLOADING')
 next()
})

全局的loading我这边是加在home.vue里,由于我这个项目是后台管理,可以加在layout.vue,其实都差不多

<div class="request-loading" :class="{'request-loading-show':loading}">
 <div class="request-loading-main" ></div>
</div>
import { mapGetters } from 'vuex'
export default { 
 data () {
 
 }
 computed: {
 ...mapState(['loading]) 
 }
<scrirpt lang="scss" scoped>
//这个我就不写了 loading样式不同 我们代码也就不同
</script>

大致代码和思路就是这样 可能会有错误 还希望各位批评指正

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
网页javascript精华代码集
Jan 24 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
jQuery Clone Bug解决代码
Dec 22 Javascript
用js来获取上传的文件名纯粹是为了美化而用
Oct 23 Javascript
让table变成exls的示例代码
Mar 24 Javascript
jQuery使用andSelf()来包含之前的选择集
May 19 Javascript
使用jQuery jqPlot插件绘制柱状图
Dec 18 Javascript
基于jquery插件实现拖拽删除图片功能
Aug 27 Javascript
js捕捉键盘事件和按键键值的方法
Oct 10 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
AngularJS 事件发布机制
Aug 28 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
使用Vue CLI创建typescript项目的方法
Aug 09 #Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
Aug 09 #Javascript
微信小程序如何连接Java后台
Aug 08 #Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 #Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
Aug 08 #Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 #Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 #jQuery
You might like
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
实用函数8
2007/11/08 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
JS实现简单打字测试
2020/06/24 Javascript
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
详解flask入门模板引擎
2018/07/18 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
职务任命书范本
2014/06/05 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
云台山导游词
2015/02/03 职场文书
教师个人教学总结
2015/02/11 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
微观世界观后感
2015/06/10 职场文书
开票证明
2015/06/23 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
MySQL的存储过程和相关函数
2022/04/26 MySQL