zoukankan      html  css  js  c++  java
  • vue项目初始化之axios封装

    参考掘金:https://juejin.im/post/6844903652881072141#heading-8

    1.初始化Vue项目


    参考博客 :https://www.cnblogs.com/xiaonq/p/11027880.html

     #使用脚手架创建vue项目 deaxios是项目名,随便取
      vue init webpack deaxios
    
      cd deaxios     #进入项目
      
      npm install axios -S #安装 axios
      
    

    2.Vue之封装axios

    可以参考大佬博客:

    https://blog.csdn.net/qq_40128367/article/details/82735310

    https://www.cnblogs.com/xiaonq/p/11027880.html


    安装

    npm install axios --save
    

    为什么要封装axios

    • axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护。

    引入

    一般我会在项目的components目录中,新建一个axios_api文件夹,然后在里面新建一个http.js和一个api.js文件。http.js文件用来封装我们的axios,api.js用来统一管理我们的接口。

    在http.js页面添加:

    1.环境的切换
    • 我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址就不多说了。
    import axios from 'axios'
    // 环境的切换
    if (process.env.NODE_ENV === 'development') {
      axios.defaults.baseURL = 'http://192.168.56.100:8888/' // 开发环境
    } else if (process.env.NODE_ENV === 'debug') {
      axios.defaults.baseURL = '' // 调试环境
    } else if (process.env.NODE_ENV === 'production') {
      axios.defaults.baseURL = '' // 生产环境
    }
    
    axios.defaults.withCredentials = true
    //跨域访问需要发送cookie时一定要加axios.defaults.withCredentials = true
    
    2.设置请求超时
    • 通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等
    axios.defaults.timeout = 1000000;
    
    3.post/put请求头的设置
    • 请求头设置application/x-www-form-urlencoded;charset=UTF-8application/json

    • post/put请求的时候,我们需要加上一个请求头,所以可以在这里进行一个默认的设置,即设置post的请求头为 application/json

    /* 
    
    设置请求传递数据的格式(看服务器要求的格式)
    x-www-form-urlencoded
    默认提交表单
    把数据对象序列化成表单数据
    
    */
    
    // axios.defaults.headers['Content-Type']='application/x-www-form-urlencoded';
    
    // axios.defaults.transformRequest =data=>qs.stringify(data);
    
    /*
    
    设置默认提交json
    
    把数据对象序列化成json字符串
    
    */
    
    //axios.defaults.headers['Content-Type'] = 'application/json'; //设置默认提交json
    
    //axios.defaults.transformRequest = data => JSON.stringify(data) //把数据对象序列化成json字符串
    
    
    
    axios.defaults.headers.post['Content-Type'] =' application/json';
    axios.defaults.headers.put['Content-Type'] = 'application/json';
    
    4.请求拦截
    /*
    
    请求拦截器:发送请求前需要调用这个函数
    
    1.当没有登录时,直接跳转到登录页
    
    2.请求发送前把token获取 设置到header中
    
    */
    
    axios.interceptors.request.use(
      config => {
        // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
        const token = sessionStorage.getItem("jwt_token");
        console.log(token);
        if (token){
          config.headers.Authorization = 'JWT '+ token
        }
        return config;
      },
      error => {
        return Promise.error(error);
      });
    
    
    
    
    
    5.响应拦截
    axios.interceptors.response.use(
      // 请求成功
      res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
    
      // 请求失败
      error => {
        if (error.response) {
          // 判断一下返回结果的status == 401?  ==401跳转登录页面。  !=401passs
          console.log(error.response);
          if(error.response.status===401){
            // 跳转不可以使用this.$router.push方法、
            // this.$router.push({path:'/login'})
            window.location.href="http://127.0.0.1:8080/#/login"
          }else{
            // errorHandle(response.status, response.data.message);
            return Promise.reject(error.response);
          }
          // 请求已发出,但是不在2xx的范围
        } else {
          // 处理断网的情况
          // eg:请求超时或断网时,更新state的network状态
          // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
          // 关于断网组件中的刷新重新获取数据,会在断网组件中说明
          // store.commit('changeNetwork', false);
          return Promise.reject(error.response);
        }
      });
    
    
    6.封装get post put delete方法
    // 封装xiaos请求  封装axios里的get
    export function axios_get(url,params){
      return new Promise(
        (resolve,reject)=>{
          axios.get(url,{params:params})
            .then(res=>{
              console.log("封装信息的的res",res);
              resolve(res.data)
            }).catch(err=>{
            reject(err.data)
          })
        }
      )
    }
    
    // 封装xiaos请求  封装axios里的post
    export function axios_post(url,data){
      return new Promise(
        (resolve,reject)=>{
          console.log(data);
          axios.post(url,JSON.stringify(data))
            .then(res=>{
              console.log("封装信息的的res",res);
              resolve(res.data)
            }).catch(err=>{
            reject(err.data)
          })
        }
      )
    }
    
    // 封装xiaos请求  封装axios里的put
    export function axios_put(url,data){
      return new Promise(
        (resolve,reject)=>{
          console.log(data);
          axios.put(url,JSON.stringify(data))
            .then(res=>{
              console.log("封装信息的的res",res);
              resolve(res.data)
            }).catch(err=>{
            reject(err.data)
          })
        }
      )
    }
    
    // 封装xiaos请求  封装axios里的delete
    export function axios_delete(url,data){
      return new Promise(
        (resolve,reject)=>{
          console.log(data);
          axios.delete(url,{params:data})
            .then(res=>{
              console.log("封装信息的的res",res);
              resolve(res.data)
            }).catch(err=>{
            reject(err.data)
          })
        }
      )
    }
    
    
    
    总结:
    • axios.get()方法和axios.post()在提交数据时参数的书写方式还是有区别的。区别就是,get的第二个参数是一个{},然后这个对象的params属性值是一个参数对象的。而post的第二个参数就是一个参数对象。两者略微的区别要留意哦!

    api.js页面

    //将我们http.js中封装好的  get,post.put,delete  导过来
    
    import {axios_get, axios_post, axios_delete, axios_put} from './http.js'
    
    
    //按照格式确定方法名
    export const user_get = p => axios_get("/user/user/", p);
    export const add_post1 = p => axios_post("/user/user/", p);
    //向后端传输要修改数据的id
    export const user_updatad = p => axios_put("/user/user/?id="+p.id, p);	
    export const del = p => axios_delete("/user/user/", p );
    
    
    

    应用到组件

    <template>
      <div>
        <h1>查询数据</h1>
        <a>
          <button @click="add_post">点击添加</button>
        </a>
        <div v-for="i in list">
          <p>姓名:{{i.name}}
            <!--<router-link :to="{'path':'/updated/','query':{'id':i.id}}">点击修改</router-link>-->
            <!--<router-link :to="{'path':'/del/','query':{'id':i.id}}">删除</router-link>-->
            <a>
              <button @click="created(i.id)">修改</button>
            </a>
            <a>
              <button @click="user_del(i.id)">删除</button>
            </a>
          </p>
          <p>年龄:{{i.age}}</p>
          <p>家乡:{{i.home}}</p>
          <div style="border:1px solid #CCC"></div>
        </div>
      </div>
    </template>
    
    <script>
      import {user_get,del} from '../axios_api/api';
    
      export default {
        name: "Get",
        data() {
          return {
            list: [],
            id: '',
          }
        },
        methods: {
             //查询数据
          get_data(){
           user_get().then(resp => {
              this.list = resp;
              console.log(resp)
            });
          },
             //点击跳转添加页面
          add_post() {
            this.$router.push('/post')
          },
             //点击跳转修改页面
          created(id) {
            this.$router.push({path: "/updated?id=" + id})
          },
             //删除
          user_del(id){
            del({id:id}) .then(resp => {
                console.log(resp);
                if (resp.code == '200') {
                  alert('删除成功!!!')
                } else {
                  alert('删除失败---')
                }
              }).catch(error => {
                console.log(error)
              })
            },
        },
           //初始化页面后就会执行这个函数
        mounted: function () {
          this.get_data()
        },
        created() {}
      }
    </script>
    
    <style scoped>
    
    </style>
    
    
    
    从小白到大神的蜕变~~
  • 相关阅读:
    MySQL学习总结(五)表数据查询
    MySQL学习总结(四)数据的基本操作以及MySQL运算符和常用函数
    MySQL学习总结(三)索引
    MySQL学习总结(二)数据库以及表的基本操作
    MySQL学习总结(一)下载与安装
    记一次SmtpClient发送邮件引发的系列问题
    C语言学习笔记(五) 数组
    C语言学习笔记(四) 流程控制
    C语言学习笔记(三) 输入输出函数的基本用法以及运算符
    C语言学习笔记(二) 基础知识
  • 原文地址:https://www.cnblogs.com/tjw-bk/p/13747853.html
Copyright © 2011-2022 走看看