vue axios

作者: wivwiv | 来源:发表于2018-03-13 22:12 被阅读153次
import axios from 'axios'

import router from '../router'
// 全局 loading 状态可以共用在大部分组件中,如:
// <el-table v-loading="$store.state.loading"></el-table>
import store from '../store'

// 基本定义
Object.assign(axios.defaults, {
  headers: {
    'Content-Type': 'application/json',
  },
  baseURL: '/api',
})

// 请求拦截器添加 headers 添加认证信息
axios.interceptors.request.use((config) => {
  if (store.state.user.password) {
    config.auth = {
      username: store.state.user.password,
    }
  } else {
    // 是否需要跳转到登录认证页
  }
  store.dispatch('LOADING', true)
  return config
}, (error) => {
  console.warn('Request Error: ', error)
})

// handleError
function handleError(error) {
  const status = error.response && error.response.status
  // 修改请求状态
 store.dispatch('LOADING', false)
  // 跳到登录页面
  if (status === 401) {
    // 清空登录信息
    store.dispatch('LOG_IN', {})
    router.push({ path: '/login', query: { to: router.fullPath } })
  } else {
    return Promise.reject(error)
  }
}

// 响应拦截器检测错误
axios.interceptors.response.use((response) => {
    // 修改请求状态
    store.dispatch('LOADING', false)
    return response
}, handleError)

// Vue 插件安装
function install(Vue) {
  // 方便进行 this.$httpGet('/data', { _limit: 10, _page: 1 }).then(cb) 快速添加查询
  Vue.prototype.$httpGet = (url, params) => axios.get(url, { params })
  Vue.prototype.$httpPost = axios.post
  Vue.prototype.$httpPut = axios.put
  Vue.prototype.$httpDelete = axios.delete
  Vue.prototype.$axios = axios
}

axios.install = install

export default axios

如何使用?
main.js

import Vue from 'vue'

import api from '~/lib/api'
Vue.use(api)
...

或者使用一个安装器

// common/mount.js
import SelfButton from '../components/SelfButton.vue'
import API from '../lib/api'

export default (Vue) => {
    // 注册用的比较多的组件
    Vue.component(SelfButton.name, SelfButton)

    // 安装 Axios
    Vue.prototype.$httpGet = (url, params) => API.get(url, { params })
    Vue.prototype.$httpPost = API.post
    Vue.prototype.$httpPut = API.put
    Vue.prototype.$httpDelete = API.delete
    Vue.prototype.$axios = API
}

// main.js
import Mount from './common/mount'

Vue.use(Mount)

overview.vue

<template>
<div class="over-view">
  <self-button :loading="$store.state.loading" @click="load">
    开始请求
  </self-button>
</div>
</template>
...
<script>
export default {
    data() {
        return {}
    },
    methods: {
        load() {
            this.$axios.post('/login', { username: 'x', password: 'y' }).then().catch()
        },
    },
    created() {
        this.$httpGet('/list/book', { _limit: 100, _page: 1, name_like: '高等数学'}).then((response) => {
            console.log('res', response.data)
        }).catch((error) => {
            console.log('error', error)
        })
    },  
}
</script>

相关文章

网友评论

      本文标题:vue axios

      本文链接:https://www.haomeiwen.com/subject/ahotqftx.html