axios与vue的配合使用事例,实现缓存和重复加载的控制
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的配合使用事例,实现缓存和重复加载的控制的更多相关文章
- 基于axios的vue插件,让http请求更简单
		
ajax-plus 基于axios 的 Vue 插件 如何使用 npm 模块引入 首先通过 npm 安装 ```npm install --save ajax-plus or yarn add aja ...
 - axios在Vue中的简单应用(一)
		
1.安装axios: npm install --save axios vue-axios 2.安装qs: qs.stringify(data)可以解决data数据格式问题 npm install - ...
 - 快速构建一个使用axios的vue应用程序(转)
		
英文原文:https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/ 译文:https://segmentfault.com/ ...
 - vue服务端渲染添加缓存
		
缓存 虽然 Vue 的服务器端渲染(SSR)相当快速,但是由于创建组件实例和虚拟 DOM 节点的开销,无法与纯基于字符串拼接(pure string-based)的模板的性能相当.在 SSR 性能至关 ...
 - vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)
		
Vue有多优秀搭配全家桶做项目有多好之类的咱就不谈了,直奔主题. 一.Vue 系列一已经用vue-cli搭建了Vue项目,此处就不赘述了. 二.Vue-router Vue的路由,先献上文档(http ...
 - axios在vue中的简单配置与使用
		
一.axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:https://hzzly.github.io/2017/03/12/ ...
 - vue中使用keepAlive组件缓存遇到的坑
		
项目开发中在用户由分类页category进入detail需保存用户状态,查阅了Vue官网后,发现vue2.0提供了一个keep-alive组件. 上一篇讲了keep-alive的基本用法,现在说说遇到 ...
 - 浅谈 Axios 在 Vue 项目中的使用
		
介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...
 - Vue keep-alive如何实现只缓存部分页面
		
prop: include: 字符串或正则表达式.只有匹配的组件会被缓存. exclude: 字符串或正则表达式.任何匹配的组件都不会被缓存. 在2.1.0版本Vue中 常见用法: // 组件 exp ...
 
随机推荐
- matlab函数每天进步一点点
			
1. 读mp4视频 : xyloObj = VideoReader('su35.mp4'); 链接 2. 查看有几个相同的函数和当前使用的函数是哪个路径下的: which -all xxx; w ...
 - vue 监听手机键盘是否弹出及input是否聚焦成功
			
//定义移动端类型 function pageStats() { let u = navigator.userAgent, app = navigator.appVersion; let obj = ...
 - 1ubuntu安装虚拟机
			
安装相关打软件:(qemu-kvm qemu-system是kvm和qemu的核心包,libvirt-bin用于管理kvm,virt-manager图形管理工具,bridge-utils vlan,主 ...
 - JS写法  数值与字符串的相互转换   取字符中的一部分显示  正则表达规则
			
http://www.imooc.com/article/15885 正则表达规则 <script type="text/javascript"> </scrip ...
 - mySql 数据库中间件 atlas的使用
			
MySQL 中间件Atlas 实现读写分离 原创 MySQL 作者:神谕丶 时间:2016-08-05 17:07:51 2410 0 〇 Atlas架构介绍 <span "=&q ...
 - python excle读
			
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/4/24 9:57 # @File : Excel读.py # @Softwa ...
 - javascript中正则动态替换为对象中的相应数据
			
使用正则进行替换以下内容 var str = 'aKey={aValue}&bKey={bValue}' 使用以下对象数据,替换value var obj = { aValue: 1, bVa ...
 - node中间件概念
			
中间件就是请求req和响应res之间的一个应用,请求浏览器向服务器发送一个请求后,服务器直接通过request定位属性的方式得到通过request携带过去的数据,就是用户输入的数据和浏览器本身的数据信 ...
 - form表单图片上传
			
1.前端页面 <div class="tkDiv" id="addLOGO" style="display:none;z-index:12;wi ...
 - Javascript 将字符串替换为特定的规律的字符串
			
Javascript 将字符串替换为特定的规律的字符串 这是测试过程,可以再简化一点. function spinalCase(str) { // "It's such a fine lin ...