import Vue from "vue";
import qs from "qs";
import Store from "../vuex/store.js"
import Router from "../router/index.js"
import isEmpty from "lodash/isEmpty"
import { isUrl } from "./match.js"
import cache from "./cache.js"
import { objToFormData } from "./help.js" let sucCode = 100000;
let cacheKey = "";
let isLoadingKey = ""; export default function apiLink(config) {
/*基本配置数据*/
let routelink = config.routelink; //api地址 need
let params = config.params; //api参数 need
let reqName = config.reqName != null ? config.reqName : config.routelink; //请求地址命名
let callback = config.callback; //成功回调 need
let error = config.error; //失败回调
let method = config.method; //请求方法
let saved = config.saved; //开启缓存
let postType = config.postType; //post的数据类型设置
cacheKey = sucCode + routelink + '/' + qs.stringify(params);
isLoadingKey = "loadkey" + reqName;
return new Promise((resolve, reject) => {
if (method == 'post') { //post方法
apiPOST(routelink, postParamsType(params, postType), reqName, callback, error, resolve)
} else { //get方法
let savedData = cache.get(cacheKey); //获取缓存数据
if (saved && !isEmpty(savedData)) { //是否读取缓存数据
callback(savedData)
} else {
apiGET(routelink, params, reqName, callback, error, resolve)
}
}
})
}
/*get方法*/
function apiGET(routelink, params, reqName, callback, error, resolve) {
if (cache.get(isLoadingKey)) return;
cache.set(isLoadingKey, true)
Vue.axios.get(routelink, { params: params, timeout: 6000 }).then((res) => {
success(routelink, res, reqName, callback, error);
saveApiData(res); //保存数据
resolve(res.data)
}).catch(err => {
fail(err, reqName, error);
})
}
/*post方法*/
function apiPOST(routelink, params, reqName, callback, error, resolve) {
if (cache.get(isLoadingKey)) return;
cache.set(isLoadingKey, true)
Vue.axios.post(routelink, params).then((res) => {
success(routelink, res, reqName, callback, error);
resolve(res.data)
}).catch(err => {
fail(err, reqName, error)
})
} /*成功回调*/
function success(routelink, res, reqName, callback, error) {
cache.set(isLoadingKey, false)
const api = res.data;
console.log(api, "API-" + reqName + "" + routelink)
if (api.code != sucCode) {
if (api.code == 100002) {
Store.dispatch("setWordsTipMsg", {
msg: "请先绑定手机",
todo: () => {
Router.push({ path: '/party/g/sendbindsms' });
}
});
return;
}
if (isUrl(api.data) && api.code != 100015) {
window.location = api.data;
return;
}
if (error) {
error(api);
} else {
        alert(api.msg)
//Store.dispatch("setWordsTipMsg", { msg: api.msg });
}
return;
} else {
callback(api.data);
}
}
/*失败回调*/
function fail(err, reqName, error) {
cache.set(isLoadingKey, false)
if (error) {
error(err);
} else {
     alert(err.msg)
//Store.dispatch("setWordsTipMsg", { msg: err.msg });
}
} function saveApiData(res) { //缓存功能
if (res.data.code == sucCode) {
cache.set(cacheKey, res.data.data)
}
} function postParamsType(params, postType) { //post 数据类型设置
if (postType == 'none') {
return params;
} else if (postType == 'formdata') {
return objToFormData({ data: params, arrayKey: false });
} else {
return qs.stringify(params, { arrayFormat: 'brackets' });
}
}

以上是本人在项目中使用的ajax部分的代码,在vue项目中能有比较好的性能和使用,可以实现缓存和对重复加载的阻止。

具体使用方法,大概是就是调用apiLink这个主要方法实现ajax请求,配置参数可以实现想实现和不想实现的功能,比如开启缓存就多加saved参数。

===POST使用事例:

apiLink({
routelink: utypes.GET_PARTY_SPEAK_ADD,
params: { mid: params, content: pubSpeakContent },
method: 'post',
callback: (res) => {
console.log(res)
}
})

以上代码就是一个post的使用事例,大家可以参考。

===GET使用事例:

apiLink({
routelink: utypes.GET_PARTY_MEET_SEARCH,
params: { mid: params, name: searchConfig.name, content: searchConfig.content },
callback: (res) => {
commit(mtypes.SET_PARTY_MEET_SEARCH, res)
}
})

以上代码就是一个get的使用事例,大家可以参考。

===使用参数说明:

apiLink({
routelink: /url, //api地址
params: {}, //参数传递
saved:true,true代表开启缓存,读取缓存功能,非必传,不传默认不读取缓存
method:'post',//post或get方法设置,非必传,不传默认get
postType:'formdata', //非必传,不传默认qs格式化
callback: (res) => { //回调 },
error:err=>{} //错误回调,非必传
})

===对象转formdata格式代码:

export function objToFormData(config) { //对象转formdata格式
let formData = new FormData();
let obj = config.data;
let arrayKey = config.arrayKey;
for (var i in obj) {
if (isArray(obj[i])) {
obj[i].map(item => {
if (!arrayKey) {
formData.append(i, item)
} else {
formData.append(i + '[]', item)
}
})
} else {
formData.append(i, obj[i])
}
}
return formData;
}

上面这个方法可以方便的实现obj对象转formdata格式。

===结论:

代码实践过,觉得挺好用,分享出来,大家参考参考,具体需要自己改进下才能适合你的项目。

axios与vue的配合使用事例,实现缓存和重复加载的控制的更多相关文章

  1. 基于axios的vue插件,让http请求更简单

    ajax-plus 基于axios 的 Vue 插件 如何使用 npm 模块引入 首先通过 npm 安装 ```npm install --save ajax-plus or yarn add aja ...

  2. axios在Vue中的简单应用(一)

    1.安装axios: npm install --save axios vue-axios 2.安装qs: qs.stringify(data)可以解决data数据格式问题 npm install - ...

  3. 快速构建一个使用axios的vue应用程序(转)

    英文原文:https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/ 译文:https://segmentfault.com/ ...

  4. vue服务端渲染添加缓存

    缓存 虽然 Vue 的服务器端渲染(SSR)相当快速,但是由于创建组件实例和虚拟 DOM 节点的开销,无法与纯基于字符串拼接(pure string-based)的模板的性能相当.在 SSR 性能至关 ...

  5. vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)

    Vue有多优秀搭配全家桶做项目有多好之类的咱就不谈了,直奔主题. 一.Vue 系列一已经用vue-cli搭建了Vue项目,此处就不赘述了. 二.Vue-router Vue的路由,先献上文档(http ...

  6. axios在vue中的简单配置与使用

    一.axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:https://hzzly.github.io/2017/03/12/ ...

  7. vue中使用keepAlive组件缓存遇到的坑

    项目开发中在用户由分类页category进入detail需保存用户状态,查阅了Vue官网后,发现vue2.0提供了一个keep-alive组件. 上一篇讲了keep-alive的基本用法,现在说说遇到 ...

  8. 浅谈 Axios 在 Vue 项目中的使用

    介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...

  9. Vue keep-alive如何实现只缓存部分页面

    prop: include: 字符串或正则表达式.只有匹配的组件会被缓存. exclude: 字符串或正则表达式.任何匹配的组件都不会被缓存. 在2.1.0版本Vue中 常见用法: // 组件 exp ...

随机推荐

  1. ps 处理gif

    ps打开gif后,做了修改(去掉了背景色),但之后发现本来是动图的gif不动了. 解决该问题需要注意两点: 一:保存时,要选择保存为web格式 二:在ps中打开时间轴,在时间轴中选中某一帧时,只能有多 ...

  2. 【EMV L2】2CS.001.00 ~ 2CS.007.00

    测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...

  3. the evolution of Lua 全文翻译

    终于赶在春节前将论文全文翻译完,以后有时间将前面三章重新翻译一次,因为刚开始的时候没打算全文翻译的..第一次每天花25分钟完成这么长的一篇翻译,证明滴水可以穿石,哈哈哈 中文地址:Lua的演进 祝各位 ...

  4. UT源码105032014093

    需求描述: 设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Ce ...

  5. Python 配置 selenium 模拟浏览器环境,带下载链接

    使用浏览器渲染引擎.直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句. 这方法在爬虫过程中会打开一个浏览器,加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来 ...

  6. 普通路由器刷开源固件DD-WRT的简单过程

    DD-WRT是基于Linux的无线路由软件,功能强大,它提供了许多一般路由器的软体所没有的功能,将路由器固件升级到DD-WRT可以提升内建于预设固件的限制,并将其转换成强大且具有进阶功能的商业级路由器 ...

  7. 使用python编辑和读取word文档

    python调用word接口主要用到的模板为python-docx,基本操作官方文档有说明. python-docx官方文档地址 使用python新建一个word文档,操作就像文档里介绍的那样: fr ...

  8. Java_04循环结构

    1.while 循环结构 格式: while(循环条件){ } 关键字 while 后的小括号中的内容是循环条件.循环条件是一个表达式,值为布尔类型. { }大括号中的语句统称为循环操作,又称为循环体 ...

  9. URL编码表 Base64编码表 HTTP消息含义

    URL编码表 backspace 8% A 41% a 61% § %A7 Õ %D5   tab 9% B 42% b 62% « %AB Ö %D6   linefeed %0A C 43% c ...

  10. sosreport-汇总收集linux系统信息

    有时候我们想将Linux服务器信息一次性查询并导出发送给他人,我们可以使用这个sosreport这个工具 安装  yum install sos -y 收集信息 sosreport 收集到的信息默认保 ...