Nuxt中针对axios做二次封装小记

2022-08-14  本文已影响0人  周星星的学习笔记

使用Nuxt开发网站,不可避免需要请求接口,而请求接口用得最多的就是axios了,但是直接使用axios来请求接口可能会有诸多不便,所以在此基础上就做了二次封装,方便开发过程中使用,下面就简单介绍一下我个人是如何封装的。

一、安装@nuxtjs/axios模块

#这个是Nuxt自带的模块
npm i @nuxtjs/axios -S

二、plugins目录中新增axios.js文件

export default ({ $axios, app, store }, inject) => {
  //请求拦截
  $axios.interceptors.request.use(
    (config) => {
      /** 如果接口需要携带请求头可以在此设置
      const baseHeaders = getAccessApiHeaders(app)
      config.headers = {
        ...baseHeaders,
        ...config.headers
      }
      */
      if (
        config.method === 'post' ||
        config.method === 'put' ||
        config.method === 'delete'
      ) {
        config.data = {
          ...config.data
        }
      } else if (config.method === 'get') {
        config.params = {
          ...config.params
        }
      }
      return config
    },
    (error) => {
      // 对请求错误做些什么
      return Promise.reject(error)
    }
  )
  //相应拦截
  $axios.interceptors.response.use(
    (response) => {
      //返回结果
      return response.data
    },
    (err) => {
      const status = err.response.status
      //其他错误情况统一处理
      const errorMsg = {
        code: -1,
        msg: '服务器内部错误',
        data: {
          status: status,
          message: err.response.statusText
        }
      }
      //返回数据
      return errorMsg
    }
  )
  //请求Api接口
  inject('requestApi', (url, data = {}, method = 'GET') => {
    if (method == 'GET') {
      return $axios.get(url, {
        params: data
      })
    } else {
      return $axios.post(url, data)
    }
  })
}

三、plugins目录中新增api.js文件用于接口的统一配置

export default ({ app }, inject) => {
  //配置基础接口域名
  let baseApiDomain = 'https://api.xxx.com/'
  //基准域名
  const baseApiUrl = baseApiDomain + 'api'
  //接口配置
  const _API = {
    //评论列表接口
    getCommentList: (data) =>
      app.$requestApi(`${baseApiUrl}/aosbase/_comment_show`, data),
    //发表评论
    submitComment: (data) =>
      app.$requestApi(`${baseApiUrl}/aosbase/comment_sub`, data, 'POST'),
    //可以添加更多接口...
  }
  //注入到全局nuxt示例中
  inject('api', _API)
}

四、在nuxt.config.js中增加如下的配置

plugins: [
    '@/plugins/api',
    ...
],
modules: [
    '@nuxtjs/axios',
    ...
],
axios: {
    baseURL: '/'
},

五、使用

1.服务端周期中使用(例如:asyncData中使用)

//示例代码
async asyncData({ app, params }) {
    //获取评论列表
    const commentList = await app.$api.getCommentList({
        offset: 0,
        count: 5
    })
     if (res.code === '0') {
         return {
            //评论列表
            commentList:res.data
         }
    }
}

2.客户端周期中使用(例如mounted中使用调用方法)

//示例代码
//methods中定义方法
async getCommentList() {
  const params = {
      offset: 0,
      count: 10
  }
  const res = await this.$api.getCommentList(params)
  if (res.code === '0') {
     //评论列表
     this.commentList = res.data
  }
},
上一篇下一篇

猜你喜欢

热点阅读