Vux+Axios拦截器增加loading的问题及实现方法
很多时候,我们在页面使用ajax刷新时候,会希望它出现loading的图标,让用户体验更好一些。那么如果我们每次在axios里面进行请求,都要显示loading图标的话,那么没有一个全局的方法的话,势必会造成代码冗余的问题。有什么方法可以实现这个方法呢?
这里,我们就要用到axios的请求拦截器与相应拦截器了
首先,我们在请求拦截器里面增加一个vux的loading组件
axios.interceptors.request.use( config => { //请求拦截器,调用loading插件 // 显示loading // 判断是否重复提交请求,也就是loading是否还存在,如果存在则不显示新的loading let isshow = window.app.$vux.loading.isvisible() if(!isshow&&config.showloading){ window.app.$vux.loading.show({ text: 'loading' }) } config.data = json.stringify(config.data); config.headers = { 'content-type': 'application/json', } return config; }, error => { return promise.reject(err); } );
整个数据里面,我们看到了里面有一个参数是$vux.loading.isvisible()
这个。这个是vux自带的一个loading状态显示的参数。如果loading正在显示的话,它会是true,否则的话就显示false
因为我们不希望同时有多个请求的时候,出现多个loading状态,这样的话用户看起来会很迷茫,所以我们在调用的时候,先判断一下这个状态。
然后在响应拦截器里面关掉它就好了
下面通过实例代码介绍下vue中使用axios
1.安装axios
npm:
$ npm install axios -s
cdn:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
2.配置axios
在项目中新建api/index.js文件,用以配置axios
api/index.js
import axios from 'axios'; let http = axios.create({ baseurl: 'http://localhost:8080/', withcredentials: true, headers: { 'content-type': 'application/x-www-form-urlencoded;charset=utf-8' }, transformrequest: [function (data) { let newdata = ''; for (let k in data) { if (data.hasownproperty(k) === true) { newdata += encodeuricomponent(k) + '=' + encodeuricomponent(data[k]) + '&'; } } return newdata; }] }); function apiaxios(method, url, params, response) { http({ method: method, url: url, data: method === 'post' || method === 'put' ? params : null, params: method === 'get' || method === 'delete' ? params : null, }).then(function (res) { response(res); }).catch(function (err) { response(err); }) } export default { get: function (url, params, response) { return apiaxios('get', url, params, response) }, post: function (url, params, response) { return apiaxios('post', url, params, response) }, put: function (url, params, response) { return apiaxios('put', url, params, response) }, delete: function (url, params, response) { return apiaxios('delete', url, params, response) } }
这里的配置了post、get、put、delete方法。并且自动将json格式数据转为url拼接的方式
同时配置了跨域,不需要的话将withcredentials设置为false即可
并且设置了默认头部地址为:,这样调用的时候只需写访问方法即可
3.使用axios
注:put请求默认会发送两次请求,第一次预检请求不含参数,所以后端不能对put请求地址做参数限制
首先在main.js中引入方法
import api from './api/index.js'; vue.prototype.$api = api;
然后在需要的地方调用即可
this.$api.post('user/login.do(地址)', { "参数名": "参数值" }, response => { if (response.status >= 200 && response.status < 300) { console.log(response.data);\\请求成功,response为成功信息参数 } else { console.log(response.message);\\请求失败,response为失败信息 } });
总结
以上所述是小编给大家介绍的vux+axios拦截器增加loading的问题及实现方法,希望对大家有所帮助
推荐阅读
-
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
-
使用vue-router与v-if实现tab切换遇到的问题及解决方法
-
Vux+Axios拦截器增加loading的问题及实现方法
-
使用vue-router与v-if实现tab切换遇到的问题及解决方法
-
php优化及高效提速问题的实现方法第1/2页
-
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
-
php优化及高效提速问题的实现方法_PHP
-
php优化及高效提速问题的实现方法
-
JavaScript实现DIV层拖动及动态增加新层的方法_javascript技巧
-
Tensorflow and deep learning, without a PhD实现过程中遇到的问题及解决方法