nuxt统一管理api模块

思路

创建一个用于暴露api的plugin, 并将axios传参入api模块中调用

步骤
  1. 创建axios拦截器,统一管理请求(这步可有可无)
//plugins/axios
export default function({ store, redirect, req, router, $axios }) {
   
  $axios.interceptors.request.use(config => {
    return config;
  });
  $axios.interceptors.response.use(
    response => {

      if (!response.data.success) {
        return Promise.reject(response.data.msg);
      } else {
        return Promise.resolve(response.data);
      }
    },
    error => {

      let errinfo = error.response.data 
     
      return Promise.reject(errinfo);  
    }
  );
}

  1. 创建api模块:
    示例目录:
|--api
    |---index.js       //api模块入口文件
    |---apilist
    	|---home.js    //各个api接口
    	|---article.js

api/index.js: 用于导入apilist中的所有接口,
此时api/index模块导出为一个object, 参数为apilist中每个文件名,value值为对应的函数

// api/index.js
const modulesFiles = require.context("./apilist", true, /\.js$/);
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, "$1");

  const value = modulesFiles(modulePath);

  modules[moduleName] = value.default || value;

  return modules;
}, {});

export default modules;

//home.js 传入的axios参数调用
export default axios => ({
  list(data) {
    return axios.post(`/api/home/list`, data);
  }
});

  1. 使用plugin中inject参数暴露api ,
    api注入到服务端context, vue实例, vuex中
    文档参考https://www.nuxtjs.cn/guide/plugins
//plugins/api-plugin.js

import apis from "@/api/index";
export default (ctx, inject) => {

  var apiObject = {};
  for (var i in apis) {
    apiObject[i] = apis[i](ctx.$axios);
  }
 
  //文档: https://www.nuxtjs.cn/guide/plugins
  //inject:注入到服务端context, vue实例, vuex中
  inject("api", apiObject);

};

  1. 配置nuxt.config.js
plugins: ["@/plugins/axios", "@/plugins/api-plugins"]
  1. 具体使用
    asyncData中
asyncData(ctx){
	return ctx.app.$api.home.list({page: 99}).then(res=>{
		return {
			data: res.data
		}
	})
}

页面中

mounted(){
	this.$api.home.list({page: 99}).then(res=>{
		this.data=res.data
	})
}

store中

export const actions = {
	GET_LIST({commit}){
		 return this.$api.home.list({page: 99}).then(res=>{
			 commit("setlist", res.data);
		})
	}
}
坑点:
  1. asyncData需返回Promise,Promise中返回当前页面所需的数据, 或者使用callback回调出所需的数据, 或者使用async await, 具体[参考文档https://www.nuxtjs.cn/guide/async-data]
  2. nuxt安装时勾选"@nuxtjs/axios"插件
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值