zoukankan      html  css  js  c++  java
  • 【vue】axios封装,更好的管理api接口和使用

    在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧。而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios封装区别不大,主要是补上了拦截器和和简洁一点。

    安装axios

    npm install axios --save
    

    通过挂载的axios(只是为了对比)

    main.js

    import Vue from "vue";
    import App from "./App.vue";
    import router from "./router"; // 路由
    import store from "./store"; // Vuex
    import axios from "axios";
    
    Vue.config.productionTip = false;
    
    Vue.prototype.$axios = axios;
    
    new Vue({
    	router,
    	store,
    	render: h => h(App)
    }).$mount("#app");
    

    页面上使用挂载好的axios

    // post
    this.$axios.post('products/list', { page: 1, page_size: 10 }).then(res => {
        if (res.status == 200) {
            this.productsList = res.data;
        }
    }).catch(err => {
        console.log(err);
    });
    

    通过封装的axios

    还需要安装qs(qs插件可以将字符串解析和序列化字符串)

    npm install qs
    

    然后在src下建一个api文件夹,起一个request.js,放入下面代码

    import axios from 'axios';
    import qs from 'qs';
    
    // 创建axios实例
    const service = axios.create({
        baseURL: 'http://127.0.0.1/api/', // api的base_url
        // withCredentials: true, // 跨域请求时是否发送cookies
        timeout: 5000 // 请求超时设置
    })
    
    // 请求拦截器
    service.interceptors.request.use(config => {
        // 请求前做点什么?
        if (!config.data) {
            config.data = {};
        }
    
        // console.log(config)
        // 设置公共参数
        console.log(qs.stringify(config.data));
    
        return config;
    }, error => {
        // 处理请求错误
        console.log(error); // 用于调试
        return Promise.reject(error);
    })
    
    // 响应拦截器
    service.interceptors.response.use(response => {
        // let res = respone.data; // 如果返回的结果是data.data的,嫌麻烦可以用这个,return res
        return response;
    }, error => {
        console.log('error:' + error); // 用于调试
        return Promise.reject(error);
    })
    
    export default service;
    

    接下来继续在api文件夹下面创建一个index.js文件(如果api接口分类需要分开的话就不要创建index.js,比如登录接口:login.js,用户接口:user.js...)

    import request from '@/api/request'; // 引入封装好的axios
    
    // 登录
    export function login (data) {
        return request({
            url: 'login',
            method: 'post',
            data: data
        })
    }
    
    // 产品列表
    export function productsList () {
        return request({
            url: '/products/list',
            method: 'get'
        })
    }
    

    页面上使用封装好的axios

    import { Login } from '@/utils/helpers';
    import { productsList } from '@/api'; // 默认引入index.js,如果在这个页面有其他的api就以 , 分开:{ productsList, productsPoster }
    
    export default {
        data () {
            return {
                isLoading: true,
                productsList: []
            }
        },
        created () {
            this.init();
        }
        methods: {
    
            // 初始化
            init () {
                if (!Login()) {
                    alert('请登录');
                    this.$router.go(-1)
                    return false;
                } else {
                    this.getProductsList();
                    this.isLoading = false;
                }
            },
    
            // 获取产品列表
            getProductsList () {
    
                // get
                productsList().then(res => {
                    if (res.status == 200) {
                        this.productsList = res.data;
                    }
                }).catch(err => {
                    console.log(err);
                });
    
                // post
                productsList({ page: 1, page_size: 10 }).then(res => {
                    if (res.status == 200) {
                        this.productsList = res.data;
                    }
                }).catch(err => {
                    console.log(err);
                });
            }
        }
    }
    

    以上就是这篇axios封装的所有内容了,看到这里的伙伴们如果有不明白的地方请留言哦,如果写的不好也可以留言吐槽!!!

    总结

    axios封装的好处在于方便的管理api,我认为这是很好的方式,而且有统一处理的拦截器,如果在每个页面都以

    this.$axios.get('/api/login').then(res => {});
    

    的方式,到了需要修改的时候就得需要一个页面一个页面的去找,这样会增加工作量(虽然这个理由可以摸鱼())。

    原文链接:https://blog.langting.top/archives/73.html

  • 相关阅读:
    富文本ZSSRichTextEditor之趟坑集锦
    iOS11及Xcode9适配问题汇总
    XIB中拖UIScrollView的困难
    Glide加载图片问题记录
    微信关注事件bug记录
    kswapd0 进程 设置 swap
    AJAX请求返回HTTP 400 错误
    通过jQuery Ajax提交表单数据时同时上传附件
    JS---DOM---事件冒泡和阻止事件冒泡,总结事件
    JS---DOM---为元素绑定事件和解绑事件的兼容代码
  • 原文地址:https://www.cnblogs.com/langting/p/13043198.html
Copyright © 2011-2022 走看看