vue-resource 拦截器interceptors使用详解


Posted in Vue.js onJanuary 18, 2021

前言

拦截器-interceptor

在现代的一些前端框架上,拦截器基本上是很基础但很重要的一环,比如Angular原生就支持拦截器配置,VUE的Axios模块也给我们提供了拦截器配置,那么拦截器到底是什么,它有什么用?

拦截器能帮助我们解决的

  • 添加统一的request的参数
  • 比如header中加入X-Requested-With,比如客户端需要实现sign和token的验证机制,比如你可以写$http.get(‘/files', params),拦截器帮你拼接成 http://www.xxxx.com/1/files 这样的请求地址
  • 处理统一的responseError
  • 比如重连机制,拿到error.code错误码重连,比如token过期,重新拿到token再次send request
  • 比如统一报错信息,给所有返回的404来个提示也会很酷

在vue项目使用vue-resource实现异步加载的过程中,需要在任何一个页面任何一次http请求过程中,增加对token过期的判断,如果token已过期,需要跳转至登录页面。如果要在每个页面中的http请求操作中添加一次判断,那将会是一个非常大的修改工作量。那么vue-resource是否存在一个对于任何一次请求响应捕获的的公共回调函数呢?答案是有的!

vue-resource的interceptors拦截器的作用正是解决此需求的妙方。在每次http的请求响应之后,如果设置了拦截器,会优先执行拦截器函数,获取响应体,然后才会决定是否把response返回给then进行接收。那么我们可以在这个拦截器里边添加对响应状态码的判断,来决定是跳转到登录页面还是留在当前页面继续获取数据。

vue-resource 拦截器interceptors使用详解

安装与引用

NPM: npm install vue-resource --save-dev

/*引入Vue框架*/
import Vue from 'vue'
/*引入资源请求插件*/
import VueResource from 'vue-resource'

/*使用VueResource插件*/
Vue.use(VueResource)

下边代码添加在main.js中

Vue.http.interceptors.push((request, next) => {
 console.log(this)//此处this为请求所在页面的Vue实例
 // modify request
 request.method = 'POST';//在请求之前可以进行一些预处理和配置

 // continue to next interceptor
next((response) => {//在响应之后传给then之前对response进行修改和逻辑判断。对于token时候已过期的判断,就添加在此处,页面中任何一次http请求都会先调用此处方法
  
response.body = '...';


return response;

 });
});

拦截器实例

(1)为请求添加loading效果

通过inteceptor,我们可以为所有的请求处理加一个loading:请求发送前显示loading,接收响应后隐藏loading。
具体步骤如下:

//1、添加一个loading组件
<template id='loading-template'>
  <div class='loading-overlay'></div>
</template>

//2、将loading组件作为另外一个Vue实例的子组件
var help = new Vue({
  el: '#help',
  data: {
    showLoading: false
  },
  components: {
    'loading': {
      template: '#loading-template',
    }
  }
})

//3、将该Vue实例挂载到某个HTML元素
<div id='help'>
  <loading v-show='showLoading'></loading>
</div>

//4、添加inteceptor
Vue.http.interceptors.push((request, next) => {
  loading.show = true;
  next((response) => {
    loading.show = false;
    return response;
  });
});

但是,当用户在画面上停留时间太久时,视图数据可能已经不是最新的了,这时如果用户删除或修改某一条数据,如果这条数据已经被其他用户删除了,服务器会反馈一个404的错误,但由于我们的put和delete请求没有处理errorCallback,所以用户是不知道他的操作是成功还是失败了。这个问题,同样也可以通过inteceptor解决。

(2)为请求添加共同的错误处理方法

//1、继续沿用上面的loading组件,在#help元素下加一个对话框
<div id='help'>
  <loading v-show='showLoading' ></loading>
  <modal-dialog :show='showDialog'>
    <header class='dialog-header' slot='header'>
      <h3 class='dialog-title'>Server Error</h3>
    </header>
    <div class='dialog-body' slot='body'>
      <p class='error'>Oops,server has got some errors, error code: {{errorCode}}.</p>
    </div>
  </modal-dialog>
</div>

//2、给help实例的data选项添加两个属性
var help = new Vue({
    el: '#help',
    data: {
      showLoading: false,
      showDialog: false,
      errorCode: ''
    },
    components: {
      'loading': {
        template: '#loading-template',
      }
    }
  })

//3、修改inteceptor
Vue.http.interceptors.push((request, next) => {
  help.showLoading = true;
  next((response) => {
    if(!response.ok){
      help.errorCode = response.status;
      help.showDialog = true;
    }
    help.showLoading = false;
    return response;
  });
});

到此这篇关于vue-resource 拦截器interceptors使用详解的文章就介绍到这了,更多相关vue-resource拦截器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
详细聊聊vue中组件的props属性
Nov 02 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
Feb 18 Vue.js
vue实现Toast组件轻提示
Apr 10 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 #Vue.js
Vue实现多页签组件
Jan 14 #Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 #Vue.js
Vue中引入svg图标的两种方式
Jan 14 #Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 #Vue.js
vue 递归组件的简单使用示例
Jan 14 #Vue.js
vue element和nuxt的使用技巧分享
Jan 14 #Vue.js
You might like
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
php截取字符串函数分享
2015/02/02 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
javascript实现图片轮播效果
2016/01/20 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
JS实现复制功能
2017/03/01 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
对Python中range()函数和list的比较
2018/04/19 Python
windows下python和pip安装教程
2018/05/25 Python
python实现朴素贝叶斯算法
2018/11/19 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python实现弹跳小球
2019/05/13 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
教师年终个人自我评价
2013/10/04 职场文书
档案工作汇报材料
2014/08/21 职场文书
软件测试专业推荐信
2014/09/18 职场文书
大学生读书笔记大全
2015/07/01 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android
Java的Object类的九种方法
2022/04/13 Java/Android