05Vue3-Vue中使用axios异步通信

本文介绍了Axios作为异步通信框架的特点,并详细讲解了如何在Vue项目中使用Axios进行数据请求及提交操作,包括基本用法、封装请求方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Axios

Axios 是一个开源的可以用在浏览器端和 NodeJS 的异步通信框架,她的主要作用就是实现 AJAX 异步通信,其功能特点如下:
从浏览器中创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API [JS中链式编程]
拦截请求和响应
转换请求数据和响应数据
取消请求
自动转换 JSON 数据
客户端支持防御 XSRF(跨站请求伪造)

GitHub:https://github.com/axios/axios
 中文文档:http://www.axios-js.com/

为什么使用Axios

1.axios:

  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 客户端支持防止CSRF
  • 提供了一些并发请求的接口(重要,方便了很多的操作)

2.jQuery ajax:

  • 本身是针对MVC的编程,不符合现在前端MVVM
  • 基于原生的XHR开发,XHR本身的架构不清晰,已经有了fetch的替代方案
  • JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理(采取个性化打包的方案又不能享受CDN服务)
Axios API
  • axios.request(config)

  • axios.get(url [,config])

  • axios.delete(url [,config])

  • axios.head(url [,config])

  • axios.post(url [,data [,config]])

  • axios.put(url [,data [,config]])

  • axios.patch(url [,data [,config]])

Vue使用axios向服务器请求数据

<template>
  <div class="footer">
    <ul>
      <li v-for="(item,index) in links" :key="index">
        <a href="item.url">{{item.name}}</a>
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios'
export default {
  name: "MyFooter",
  data() {
    return {
      links: []
    }
  },
  mounted() {
    axios.get('http://api.eduwork.cn/admin/link')
      .then(res=>{
        this.links = res.data
      }).catch(err=>{
       console.log(err);
    })
  }
}
</script>

<style scoped>
.footer {
  float: left;
  margin-top: 20px;
  width: 100%;
  height: 100px;
  background-color: cornflowerblue;
}
</style>
Vue使用axios向服务器提交数据
<template>
  <from action="#">
    网站名称: <input type="text" v-model="link.name">{{link.name}}<br>
    网站位置: <input type="text" v-model="link.url">{{link.url}}<br>
    位置排序: <input type="text" v-model="link.ord">{{link.ord}}<br>
    <input type="hidden" v-model="link.do_submit">{{link.do_submit}}<br>

    <button @click.prevent="doSubmit">添加数据</button>
  </from>
</template>

<script>
import axios from "axios";
export default {
  name: "MyConn",
  data() {
    return {
      num: 0,
      link: {
        name:'',
        url:'',
        ord: 0,
        do_submit: true
      }
    }
  },
  methods: {
    doSubmit() {
      axios.post('http://api.eduwork.cn/admin/link/add',this.link,{
        //将数据转换成字符串拼接
        transformRequest: [
            function (data) {
              let str = ''
              for (let key in data) {
                str += encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) + '&'
              }
              return str
            }
        ],
        headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        }
      }).then(res=>{
        console.log(res);
      }).catch(err=>{
        console.log(err);
      })
    }
  }
}
</script>
<style scoped>
.myconn {
  width: 90%;
  height: 150px;
  background-color: brown;
  margin: 10px;
}
</style>
Vue封装网络请求

network/request.js

import axios from "axios";

//创建实例
const instance = axios.create({
    baseURL:'http://api.eduwork.cn/admin',
    timeout: 5000
})

export function get(url,params) {
    return instance.get(url,{
        params
    })
}

get().then().catch();


export function post(url, params) {
    return instance.post(url, params, {
        //将数据转换成字符串拼接
        transformRequest: [
            function (data) {
                let str = ''
                for (let key in data) {
                    str += encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) + '&'
                }
                return str
            }
        ],
        headers: {
            "Content-Type": "application/x-www-form-urlencoded"
        }
    })
}

export function del(url) {
    return instance.delete(url)
}

//请求拦截器
instance.interceptors.request.use(
    config=>{
        config.headers.token = '123243'
        return config
    },
    error => {
        return Promise.reject(error)
    },
)
//响应拦截器
instance.interceptors.response.use(
    response => {
        // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
        // 否则的话抛出错误
        if (response.status === 200) {
            return Promise.resolve(response);
        } else {
            return Promise.reject(response);
        }
    },
    error => {
        if (error.response.status) {
            return Promise.reject(error.response);
        }
    }
);

应用axios封装

提交数据

<template>
  <from action="#">
    网站名称: <input type="text" v-model="link.name">{{link.name}}<br>
    网站位置: <input type="text" v-model="link.url">{{link.url}}<br>
    位置排序: <input type="text" v-model="link.ord">{{link.ord}}<br>
    <input type="hidden" v-model="link.do_submit">{{link.do_submit}}<br>

    <button @click.prevent="doSubmit">添加数据</button>
  </from>
</template>
<script>
import {post} from '../../network/request'
export default {
  name: "MyConn",
  data() {
    return {
      num: 0,
      link: {
        name:'',
        url:'',
        ord: 0,
        do_submit: true
      }
    }
  },
  props: {
    article: {
      type: Array
    }
  },
  methods: {
    doSubmit() {
      post('/link/add',this.link).then(res=>{
          console.log(res);
        }).catch(err=>{
          console.log(err);
        })
    }
  }
}
</script>

<style scoped>
.myconn {
  width: 90%;
  height: 150px;
  background-color: brown;
  margin: 10px;
}
</style>

请求数据

<template>
  <div class="footer">
    <ul>
      <li v-for="(item,index) in links" :key="index">
        <a href="item.url">{{item.name}}</a>
      </li>
    </ul>
  </div>
</template>

<script>
import {get} from '.../network/request'
export default {
  name: "MyFooter",
  data() {
    return {
      links: []
    }
  },
  mounted() {
    get('/link',{id:1}).then(res=>{
        this.links = res.data
      }).catch(err=>{
       console.log(err);
    })
  }
}
</script>

<style scoped>
.footer {
  float: left;
  margin-top: 20px;
  width: 100%;
  height: 100px;
  background-color: cornflowerblue;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值