后台管理系统loading的局部刷新

在一次vue+element-ui后台管理系统的项目中,遇到这样一个问题,引入element-ui加载框后,loading会占满整个屏幕,虽然通过改变路由实现了局部刷新,但是loading的全屏刷新,让人看上去很是不爽,以为是全局刷新。再一个问题就是,一个页面中可能含有的多个请求,在拦截器汇总设置关闭loading后,会出现的问题就是,有些数据还是空的,但是loading框就已经关闭了我们需要实现的是所有请求完成后关闭loading。所以这是另一个问题。 

所以为了解决这两个问题做此总结,帮助更多的小伙伴脱坑。
如果要实现全局的刷新则可以查看博主的另一片总结:传送门
 
没有思路就没有出路,先说思路:
 
局部的loading框的出现,element-ui在vue中引入后,就会默认在vue原型链上挂在一个loaiding方法,可以通过vue.prototype.$loading看到,解决问题的关键就在这个方法中,该方法中可以设置这么几个属性lock,text,target,background,我们搞清楚这些,问个问题也就迎刃而解。lock可以看作是loading的开关,text则是loading的文本的提示信息。target则是根据类型显示需要出现loading的区域。background则是loading的bgcolor
 
所有请求完成后再关闭loading,默认大家都知道vue拦截器。解决思路比较简单,创建一个定时器,在request时,num++,在response时num--当num<=0时,则所有请求都有了结果,这个时候我们就可以关闭loading了。 

情景及Demo

后台管理系统,header,aside,main,除了loading,404外,实现main的局部刷新,且所有请求完成后再关闭loading框。 先看我们的网络请求层,封装的fetch.js文件. 
import axios                from 'axios'
import { Message} from 'element-ui'
import router from '../router/permission'
import Vue from 'vue' // loading框设置局部刷新,且所有请求完成后关闭loading框
let loading;
function startLoading() {
loading = Vue.prototype.$loading({
lock: true,
text: "Loading...",
target: document.querySelector('.loading-area')//设置加载动画区域
});
}
function endLoading() {
loading.close();
} //声明一个对象用于存储请求个数
let needLoadingRequestCount = 0;
function showFullScreenLoading() {
if (needLoadingRequestCount === 0) {
startLoading();
}
needLoadingRequestCount++;
};
function tryHideFullScreenLoading() {
if (needLoadingRequestCount <= 0) return;
needLoadingRequestCount--;
if (needLoadingRequestCount === 0) {
endLoading();
}
}; // 请求拦截
axios.interceptors.request.use(config => {
showFullScreenLoading();
return config;
}, err => {
tryHideFullScreenLoading();
Message.error({ message: '请求超时!' });
return Promise.resolve(err);
})
// 响应拦截
axios.interceptors.response.use(res => {
tryHideFullScreenLoading();
if (res.data.code == 200) {
return res.data.result;
} else if (res.data.code == 401) {
router.push('/login');
return Promise.reject(res);
} else if (res.data.code == 201) {
Message.error({ message: res.data.msg });
return Promise.reject(res);
}
return Promise.reject(res);
}, err => {
tryHideFullScreenLoading();
if (err.response.status == 504 || err.response.status == 404) {
Message.error({ message: '服务器被吃了⊙﹏⊙∥' });
} else if (err.response.status == 403) {
Message.error({ message: '权限不足,请联系管理员!' });
} else {
Message.error({ message: '未知错误' });
}
return Promise.reject(err);
}) let base = '';
export const postRequest = (url, params) => {
return axios({
method: 'post',
url: `${base}${url}`,
data: params,
transformRequest: [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
}
export const getRequest = (url, data = '') => {
return axios({
method: 'get',
params: data,
url: `${base}${url}`
});
}
下来我们就需要查看我们的主入口文件Home.vue. 
 
<template>
<!-- 布局 -->
<el-container>
<el-header class="header-wraper" >
<admin-header></admin-header>
</el-header>
<el-container class="container">
<el-aside >
<admin-aside></admin-aside>
</el-aside>
<el-main class="loading-area">
<keep-alive>
<router-view v-if="this.$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!this.$route.meta.keepAlive"></router-view>
</el-main>
</el-container>
</el-container>
</template> <script>
import AdminAside from '@/components/Commons/Aside/index';
import AdminHeader from '@/components/Commons/Header/index'
export default {
components: {
AdminAside,
AdminHeader
},
data () {
return {}
},
}
</script> <style lang="less" scoped>
.header-wraper {
width: 100%;
height: 70px;
border-bottom: 1px solid #ccc;
overflow: hidden;
}
.container {
width: 100%;
height: 100%;
}
</style>
关键实现以上两部就可实现头部预览效果局部刷新。

Element-ui实现loading的局部刷新的更多相关文章

  1. iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除

    首先创建项目,在storyboard如下布局控件,设置好约束 然后创建cell模型类XMGWineCell数据模型类XMGWine创建UITableView,设置数据源协议,实现数据源方法懒加载数据这 ...

  2. vue + element ui 阻止表单输入框回车刷新页面

    问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...

  3. 封装一个优雅的element ui表格组件

    现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开.虽然element ui的table组件很好.但是表格和分页是分离的.每次写表 ...

  4. 实现AJAX局部刷新以及PageMethod方法的使用

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  5. Android 结合实际项目学会ListView局部刷新和相关知识《一》

    转载本专栏博客,请注明出处:道龙的博客 最近在公司参与的项目中有一个界面需要做局部UI更新处理,把其化烦为简为Demoi形式写在这里.我们还是运行该Demo,知道ListView局部刷新的使用场景:( ...

  6. Vue + Element UI项目初始化

    1.安装相关组件 1.1安装Node 检查本地是否安装node node -v 如果没有安装,从Node官网下载 1.2安装npm npm -v 如果没有安装:使用该指令安装: npm install ...

  7. 上传图片组件封装 element ui

    // element ui 文档地址: http://element.eleme.io/#/zh-CN <template> <div> <div class=" ...

  8. element ui Angular学习笔记(一)

    1.element ui安装 npm i --save element-angular 2.Angular-cli引入 引入后需要开启ElModule.forRoot(),也可以单独引入某个组件入El ...

  9. 再说Android RecyclerView局部刷新那个坑

      RecyclerView局部刷新大家都遇到过,有时候还说会遇见图片闪烁的问题. 优化之前的效果: 优化之后的效果: 如果想单独更新一个item,我们通常会这样做,代码如下: mLRecyclerV ...

随机推荐

  1. 认识与设计Serverless(二)

    一.设计Serverless的功能模块 第一节讲了Serverless一些概念与特性,废话居多,概念的东西了解过后要有设计与构思,才能学到精髓,一个Serverless平台的形成,涉及到很多模块的架构 ...

  2. 2.2 The Object Model -- Reopening Classes and Instances

    1. 你不需要一开始定义一个类的全部内容,你可以通过使用reopen方法重新打开一个类并定义新的属性. Person.reopen({ isPerson: true }); Person.create ...

  3. #C++初学记录(素数判断2)

    素数判断2 比较简单的算法,没有技术含量 A prime number is a natural number which has exactly two distinct natural numbe ...

  4. ssm所需要的pom(jre8、tomcat8、spring4)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. 382. Linked List Random Node(蓄水池采样)

    1. 问题 给定一个单链表,随机返回一个结点,要求每个结点被选中的概率相等. 2. 思路 在一个给定长度的数组中等概率抽取一个数,可以简单用随机函数random.randint(0, n-1)得到索引 ...

  6. asp.net 获取mp3 播放时长

    1 Shell32 //添加引用:COM组件的Microsoft Shell Controls And Automation //然后引用 using Shell32; //如果出现“无法嵌入互操作类 ...

  7. pyDay16

    内容来自廖雪峰的官方网站. 1.Python内建的filter()函数用于过滤序列. 2.和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数 ...

  8. A8逻辑篇1.点亮一个LED(S5PV210.A8)

    一.虚拟机安装好后,我们用Fedora 双击.vmx文件,将会在虚拟机中打开 相应的生成: 这些文件 二.进入虚拟机页面 等待启动 账号选择其他 用户名:root 密码:111111 设置页面大小: ...

  9. 【Java----统计字符串匹配个数】

    org.apache.commons.lang3.StringUtils包带的工具类 StringUtils.countMatches(context, keyword);

  10. 使用 v-cloak 防止页面加载时出现 vue.js 的变量名

    知识点:使用 v-cloak 防止页面加载时出现 vue.js 的变量名 场景:在使用vue语法,实现下拉框功能时,展示数据列表之前,出现对应的 vuejs 变量名 代码: var vm = new ...