你如何命名 Vue.js 组件中用于喷射的 Axios 拦截器?

How do you name Axios Interceptors for exjection in Vue.js components?

我正在使用 Vue CLI 为 Axios 加载实例 属性。我添加了几个拦截器,我希望能够在 Vue 组件内部使用 Axios 实例时将它们关闭。

在文档中,Axios 建议您只标记拦截器,然后 eject 稍后通过名称。

var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

所以我遇到的问题是,我无法弄清楚谁可以命名我的拦截器以用于组件。

这是我的设置:

api-client.js

import axios from 'axios'

var client = axios.create({
  baseURL: process.env.API_DOMAIN,
  headers: { Accept: 'application/json' }
})

var unauthorizedInterceptor = client.interceptors.response.use(function (response) {
  return response
}, function (error) {

  ...

  return Promise.reject(error)
})

export default client

main.js

import Vue from 'vue'
import apiClient from './api-client'

Vue.prototype.$apiClient = apiClient

new Vue({
  el: '#app',
  ...
})

component.js

<template>
  ...
</template>

<script>
export default {
  data () {
    return {
      username: null,
      email: null,
      firstName: null,
      lastName: null
    }
  },
  methods: {
    updateAccount () {
      var self = this

      var data = {
        username: this.username,
        email: this.email,
        first_name: this.firstName,
        last_name: this.lastName
      }

      self.$apiClient`enter code here`.interceptors.request.eject(unauthorizedInterceptor) // Remove interceptor here.

      self.$apiClient.patch('/me')
      .then(function () {
        ...
      })
      .catch(function () {
        ...
      })
    }
  }
}
</script>

如何命名拦截器以在组件级别将其弹出?

从您的 api-client.js 中导出拦截器,然后将其导入您要弹出的位置。

api-client.js

export let unauthorizedInterceptor = ...
export default client

component.js

import { unauthorizedInterceptor } from "./api-client"

...
self.$http.interceptors.request.eject(unauthorizedInterceptor)

您可能还想导出拦截器函数本身,以便在需要时将其添加回去。

或者导出一两个可以为您进行此管理的函数。

api-client.js

let unauthorizedInterceptor

export function removeUnauthorizedInterceptor() {
    axios.interceptors.request.eject(unauthorizedInterceptor)
}

export function addUnauthorizedInterceptor(){
    unauthorizedInterceptor = axios.interceptors.response.use(...)
}

component.js

import { removeUnauthorizedInterceptor} from "./api-client"
removeUnauthorizedInterceptor()