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. phpstorm快捷键总结

    如果映射的是eclipse的快捷键,又同时安装了英特尔的GPU软件,那么会有这个快捷键冲突 就是快速复制快捷键:ctrl+alt+方向键  会调用英特尔旋转屏幕,禁用掉即可 PhPStorm 是 Je ...

  2. autofac使用总结

    转摘自:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 注册部分: AutoFac是.net平台下的IOC容器产品,它可以管理 ...

  3. leetcode 381.Insert Delete GetRandom

    这道题中要求使用O(1)的方法来删除和插入元素的,那么首先需要寻找到对应的元素,这个可以使用map的O(1)的查询时间的,然后是删除对应的元素的,那么可以根据 堆排序中类似的做法把最后面的元素插入到前 ...

  4. ubuntu下编译小知识点

    #改变编译器选项 SET(CMAKE_C_COMPILER"g++") #出现如下错误:添加C++11特性 #error: #error This file requires co ...

  5. 联想Y410P在Ubuntu系统下开关机及插耳机破音“啪啪”的解决办法

    转载自:https://blog.csdn.net/YiKangJ/article/details/81239556 1.解决开关机“啪啪响”: options snd-hda-intel model ...

  6. 学习flask需要用到的包

    Flask 需要下载的包 1.pip install flask 2.pip install flask-script 3.pip install flask-sqlalchemy 4.pip ins ...

  7. 03MYSQL数据库

    mySQL 数据库 储存数据,属于中小型数据库   默认端口号 3306  密码root sql是一门编程语言 结构化查询语言  是强类型语言(定义变量时要指定变量类型) 字符串有两种类型:  定长: ...

  8. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

  9. 思科模拟器-使用vlan划分子网

    此博客为初始化版本,未经完善,后续我再整理一下 小技巧:有时候我们不小心执行了一条错误命令,可以尝试使用在该命令前加一个no进行撤销 首先说一下网络设备的选择 在该实验中我主要用到一台三层交换机(思科 ...

  10. Linux系统时间的设置

    1. Linux系统时间的设置 在Linux中设置系统时间,可以用date命令: //查看时间[root@node1 ~]# dateTue Feb 25 20:15:18 CST 2014//修改时 ...