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格式。

===结论:

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

原文地址:https://www.cnblogs.com/jocongmin/p/9016728.html

时间: 2024-09-30 16:51:34

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

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

ajax-plus 基于axios 的 Vue 插件 如何使用 npm 模块引入 首先通过 npm 安装 ```npm install --save ajax-plus or yarn add ajax-plus -S <p>然后在入口文件引入并配置:</p> <p>对标axios的配置,详见<a href="https://www.npmjs.com/package/axios" rel="nofollow noreferrer&q

vue服务端渲染添加缓存的方法

什么是服务器端渲染(SSR)? Vue.js 是构建客户端应用程序的框架.默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM.然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序. 服务器渲染的 Vue.js 应用程序也可以被认为是"同构"或"通用",因为应用程序的大部分代码都可以在服务器和客户端上运行. 缓存 虽然 Vue 的服务

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

Vue有多优秀搭配全家桶做项目有多好之类的咱就不谈了,直奔主题. 一.Vue 系列一已经用vue-cli搭建了Vue项目,此处就不赘述了. 二.Vue-router Vue的路由,先献上文档(https://router.vuejs.org/zh-cn/). 路由在全家桶里面定位是什么呢,创建单页应用!简单!我们知道Vuejs是一系列的组件组成应用,既然是组件那么就需要组合起来,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们! 我们一般在

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

项目开发中在用户由分类页category进入detail需保存用户状态,查阅了Vue官网后,发现vue2.0提供了一个keep-alive组件. 上一篇讲了keep-alive的基本用法,现在说说遇到的坑. 先说项目中的配置 在App.vue中的设置 在router中增加配置meta 上面这个设置后发现问题了,从category进入detail页后,状态被保存了,返回的时候保存了用户状态,达到了预期效果 但问题在于但从category返回到index后,再由index进入category时依然显

使用axios+formdata+vue上传图片遇到后台接受不到图片的值的问题

先直接贴代码 html代码如下: <input type="file"@change="getFileExpr($event)"> <el-form id="uploadForm" :rules="rules2" method="post" enctype="multipart/form-data"> 这个地方我是使用的element ui框架中的form组件 原

Weex/Vue项目中静态资源缓存处理.md

目录 一.项目缓存问题 二.浏览器本地缓存 三.解决方案 今年公司技术考察,考察了EMAS平台,从而接触了weex,并且为了进行POC测试,大胆采用weex进行新web项目试点.weex内置了vue框架,整体框架与vue一致,好在刚接触了vue一段时间,因此用起来还算顺手,碰到问题weex官方文档没有的,基本都可以参考vue的文档. 一.项目缓存问题 第一次接触这类前后端完全分离的开发模式,一开始的确是一头雾水,一个多月时间,难点一点一点克服,目前进入项目测试阶段,经常碰到bug修复了,测试人员

vue服务端渲染页面缓存和组件缓存的实例详解

vue缓存分为页面缓存.组建缓存.接口缓存,这里我主要说到了页面缓存和组建缓存 页面缓存: 在server.js中设置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 const LRU = require('lru-cache') const microCache

vue项目微信端清理缓存问题解决

vue为单页面前端框架,清理缓存,常规的方式是添加html头部meta,如果逻辑里面是需要使用缓存的,这种方式不建议使用,代码片段如下: <html manifest="IGNORE.manifest"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1

axios在vue里的使用

// 安装 npm i axios // 引入 <script src="./node_modules/axios/dist/axios.js"></script> // 用法 //get方式请求 created() { // 在这个钩子函数中发送请求获取数据 axios .get(url) .then((res) => { console.log(res) }) }, //post方式请求 methods: { axios // 第一个参数:表示接口地址