【Vue框架】Vue2中axios发送请求—安装axios、配置全局域名、传递参数、axios原理之Promise(什么是Promise、使用原因、基本使用、相关API、async与await使用)

这篇具有很好参考价值的文章主要介绍了【Vue框架】Vue2中axios发送请求—安装axios、配置全局域名、传递参数、axios原理之Promise(什么是Promise、使用原因、基本使用、相关API、async与await使用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、axios 发送HTTP请求

官网: https://www.axios-http.cn/
vue2安装axios,NodeJs,await,async,Promise,resolve,reject

1.1 安装axios

1.1.1 安装axios库

安装 axios 通信库:npm install axios -S
vue2安装axios,NodeJs,await,async,Promise,resolve,reject

1.1.2 在全局中引入axios库

全局在main.js中引入axios: import axios from 'axios'

1.1.3 挂在原型对象

Vue.prototype.$axios = axios;
将 axios 挂载到Vue原型对象中,实现数据共享,节约内存空间。
此时在任何页面都可以使用axios获取数据。

03myaxios.vue

<template>
  <div>
    <h1>axios</h1>
  </div>
</template>

<script>
  export default {

  }
</script>

<style scode>

</style>

路由配置:router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import tab from '../components/01tab.vue'
import login from '../components/login.vue'
import mycar from '../components/mycar.vue'
import mydetail from '../components/mydetail.vue'
import myorder from '../components/myorder.vue'
import myaxios from '../components/03myaxios.vue'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/tab',
      name: 'tab',
      component: tab
    },
    {
      path: '/login',
      name: 'login',
      component: login
    },
    {
      path: '/mycar',
      name: 'mycar',
      component: mycar,
      meta:{
        needAuth:true
      }
    },
    {
      path: '/mydetail',
      name: 'mydetail',
      component: mydetail
    },
    {
      path: '/myorder',
      name: 'myorder',
      component: myorder
    },
    {
      path: '/myaxios',
      name: 'myaxios',
      component: myaxios
    }
  ]
})

vue2安装axios,NodeJs,await,async,Promise,resolve,reject

1.1.4 发起get请求

vue2安装axios,NodeJs,await,async,Promise,resolve,reject
调用接口获取数据并渲染页面。

03myaxios.vue

<template>
  <div>
    <h1>axios</h1>
    <ul>
      <li v-for="(item, i) in list" :key="i">
        <img :src="item.picUrl" alt=""/>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    data(){
      return{
        list:[]
      }
    },
    created() {
      this.$axios.get('http://api.mm2018.com:8095/api/goods/home')
      .then(res => {
        console.log(res.data.result[0].contents);
        this.list = res.data.result[0].contents;
      })
    }

  }
</script>

<style scode>

</style>

vue2安装axios,NodeJs,await,async,Promise,resolve,reject

1.2 配置全局域名

在一个项目中调用数十次接口是很常见的,后期一旦根域名发生改变,所有接口都需要修改,非常繁琐且容易出错。

this.$axios.get方法:

  • 第一个参数是接口地址
  • 第二个参数是包含根域名

axios提供了设置根域名的方法。
在main.js全局入口文件中,设置:axios.default.baseURL = "http://api.mm2018.com:8090"

main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

// 0、引入通信库axios
import axios from 'axios';
Vue.prototype.$axios = axios;

// 配置全局域名
axios.defaults.baseURL = "http://api.mm2018.com:8090";

// 1、引入Element-ui组件
// import { Button } from 'element-ui';
// Vue.use(Button)

// 2、引入Mint-ui组件
import 'mint-ui/lib/style.css';
import {Button} from 'mint-ui';
Vue.component(Button.name, Button);

Vue.config.productionTip = false  //设置在控制台环境进行代码提示作用

// 1.全局路由守卫
router.beforeEach((to,from,next) => {
  /*
    to:表示要去的新页面
    from:表示旧的页面
    next:表示是否
  */
  // 0——表示未登录
  // 1——表示已登录
  var islogin = 1;
  if(to.meta.needAuth){
    if(islogin == 0){
      router.push({name:'login'})
    }
    if(islogin == 1){
      next()
    }
  }else{
    next()
  }
})


// 2.全局过滤器
Vue.filter('toFixed1',function(val,data,data1){
  return data1 + val.toFixed(data)
})

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

组件 03myaxios.vue

<template>
  <div>
    <h1>axios</h1>
    <ul>
      <li v-for="(item, i) in list" :key="i">
        <img :src="item.picUrl" alt=""/>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    data(){
      return{
        list:[]
      }
    },
    created() {
      this.$axios.get('/api/goods/home')
      .then(res => {
        console.log(res.data.result[0].contents);
        this.list = res.data.result[0].contents;
      })
    }

  }
</script>

<style scode>

</style>

1.2.1 代码分离

随着接口的增加,created生命周期中的代码会越来越多,不利于后期维护。
可以将代码进行分离,把逻辑代码在methods中封装成一个方法,created只负责调用方法。

<template>
  <div>
    <h1>axios</h1>
    <ul>
      <li v-for="(item, i) in list" :key="i">
        <img :src="item.picUrl" alt=""/>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    data(){
      return{
        list:[]
      }
    },
    
    methods:{
      // 1.在methods中声明方法
      getData(){
        this.$axios.get('/api/goods/home')
        .then(res => {
          console.log(res.data.result[0].contents);
          this.list = res.data.result[0].contents;
        })
      }
    },
    
    created() {
      // 2.在created中调用方法
      this.getData();
    }
  }
</script>

<style scode>

</style>

1.3 axios 传递参数

在请求接口的过程中,传递参数是必不可少的。

  • 传参方式1:通过 this.$axios.get() 中的参数params属性
<template>
  <div>
    <h1>axios</h1>
    <ul>
      <li v-for="(item, i) in list" :key="i">
        <img :src="item.picUrl" alt=""/>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    data(){
      return{
        list:[]
      }
    },
    methods:{
      // 1.在methods中声明方法
      getData(){
        this.$axios.get('http://api.mm2018.com:8095/api/goods/home')
        .then(res => {
          console.log(res.data.result[0].contents);
          this.list = res.data.result[0].contents;
        })
      },
      getData1(){
        this.$axios
        .get("http://longlink.mm2018.com:8086/selectDemo",{
          params:{
            id:100
          }
        })
        .then(res =>{
          console.log(res);
        });
      },
    },
    created() {
      // 2.在created中调用方法
      this.getData();
      this.getData1();
    }
  }
</script>

<style scode>

</style>
  • 传参方式2:axios提供的通用形式
<template>
  <div>
    <h1>axios</h1>
    <ul>
      <li v-for="(item, i) in list" :key="i">
        <img :src="item.picUrl" alt=""/>
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    data(){
      return{
        list:[]
      }
    },
    methods:{
      // 1.在methods中声明方法
      getData(){
        this.$axios.get('http://api.mm2018.com:8095/api/goods/home')
        .then(res => {
          console.log(res.data.result[0].contents);
          this.list = res.data.result[0].contents;
        })
      },
      getData1(){
        this.$axios
        .get("http://longlink.mm2018.com:8086/selectDemo",{
          params:{
            id:100
          }
        })
        .then(res =>{
          console.log(res);
        });
      },
      getAll(){
        this.$axios({
          methods:"get",
          url:"http://api.mm2018.com:8095/api/goods/home",
          // data:{} 如果是post请求参数写在data中
          data:{}
        }).then(res =>{
          console.log(res);
        })
      }
    },
    created() {
      // 2.在created中调用方法
      // this.getData();
      // this.getData1();
      this.getAll();
    }
  }
</script>

<style scode>

</style>

1.4 axios原理之promise

axios是基于promise的HTTP库,支持promise的所有API,promise是JS中解决异步编程的语法。

  • 从语法上讲,promise可以看作是一个构造函数
  • 从功能上讲,promise对象用来封装异步操作并获取结果。

1.4.1 什么是promise

promise支持链式调用,可以解决回调地狱。

  • 什么是回调地狱?
    回调地狱涉及多个异步操作,多个回调函数嵌套使用。例如:有3个异步操作,第2个异步操作是以第1个异步操作的结果为条件的,同理第3个异步操作是以第2个异步操作的结果为条件。

1.4.2 为什么使用promise

  • promise支持链式调用,可以解决回调地狱。
  • 回调地狱涉及多个异步操作,多个回调函数嵌套使用。例如有3个异步操作,第2个异步操作是以第1个异步操作的结果为条件的,同理第3个异步操作是以第2个异步操作的结果为条件的。
  • 此时出现了回调函数嵌套,代码将向右侧延伸,不便于阅读,也不便于异常处理,使用promise首先能解决回调函数嵌套问题,代码从上往下执行,更有利于代码阅读及代码异常处理。

1.4.3 promise的基本使用

    myPromise(){
      const p = new Promise((resolve, reject) => {
        // 执行异步操作
        setTimeout(() => {
          const time = Date.now();
          // 当前时间为偶数代表成功,当前时间为奇数代表失败
          if(time % 2 == 0){
            // 执行成功调用resolve(value)
            resolve('成功的数据:' + time)
          } else {
            // 执行失败调用reject(reason)
            reject('失败的数据:' + time)
          }
        }, 1000)
      })

      // 调用异步then
      p.then(
        value => {
          // 成功接收value数据
          console.log('接受成功的数据---' + value);
        },
        reason => {
          // 失败接受reason数据
          console.log('接受失败的数据---' + reason);
        }
      )
    }

vue2安装axios,NodeJs,await,async,Promise,resolve,reject
代码解析如下:

  • 1、new Promise() 实例对象要传入回调函数,回调函数有两个形参,分别是 resolvereject
  • 2、在回调函数中执行异步操作,在此案例中是获取当前时间,如果当前时间为偶数,表示异步操作执行成功,如果当前时间为奇数,表示异步操作执行失败。
  • 3、如果当前时间为偶数,则调用成功的resolve()方法,方法中的参数就是需要展示的数据。
  • 4、如果当前时间为奇数,则调用失败的reject()方法,方法中的参数就是需要展示的数据。
  • 5、使用 .then() 方法获取成功或失败的数据,如果获取数据成功,则调用第一个回调函数,如果获取数据失败,则调用第二个回调函数。

1.4.4 promise的常用API

1. Promise(excutor){}
  • (1)、excutor()函数:同步执行(resolve, reject) => {}。
  • (2)、resolve()函数:定义成功时调用的函数value => {}。
  • (3)、reject()函数:定义失败时调用的函数reason => {}。

注意:excutor会在promise内部立即同步回调,异步操作则在执行器中执行。

2. Promise.prototype.then()方法:(onResolved,onRejected) => {}

在Promise的原型中存在then()方法,所有的Promise事件都可以调用。
对于是执行成功的回调函数还是执行失败的回调函数,根据Promise函数返回结果判定。

  • (1)、onResolved()函数:成功的回调函数为(value) => {}。
  • (2)、onRejected()函数:失败的回调函数为(reason) => {}。
<script>
	/*
		(1)、excutor()函数:同步执行(resolve, reject) => {}。
		(2)、resolve()函数:定义获取数据成功时调用的函数value => {}。
		(3)、reject()函数:定义获取数据失败时调用的函数reason => {}。
		异步执行是在大括号内执行。
		
		对于是执行成功的回调函数还是执行失败的回调函数,根据Promise函数返回结果判定
	*/
	var p1 = new Promise(resolve, reject) =>{
		setTimeout(() => {
			resolve('获取成功的数据');
			// reject(111);
		},1000)
	}
	
	// 当前的then()方法既可以处理获取成功的数据也可以处理获取失败的数据
	p1.then((value) => {
		console.log("成功==" + value);
	}, (reason) => {
		console.log("失败=="+value);
	});
</script>
3. Promise.prototype.catch()方法:(onRejected) => {}

onRejected()函数:失败的回调函数为(reason) => {}。

<script>
	/*
		(1)、excutor()函数:同步执行(resolve, reject) => {}。
		(2)、resolve()函数:定义获取数据成功时调用的函数value => {}。
		(3)、reject()函数:定义获取数据失败时调用的函数reason => {}。
		异步执行是在大括号内执行。
		
		对于是执行成功的回调函数还是执行失败的回调函数,根据Promise函数返回结果判定
	*/
	var p1 = new Promise(resolve, reject) =>{
	setTimeout(() => {
		// resolve('获取成功的数据');
		reject(111);
	},1000)
	}
	
	// 当前的then()方法既可以处理获取成功的数据也可以处理获取失败的数据
	p1.then((value) => {
	console.log("成功==" + value);
	})
	
	p1.catch(reason => {
	// 获取失败的数据
	console.log(reason);
	})

</script>
4. Promise.resolve()方法:(value) => {}

value:成功的数据。

  • 案例:定义成功值为1的promise对象。
/*
	定义成功回调的数据
*/
var p2 = new Promise((resolve, reject) => {
   resolve(1);
})
p2.then(value => {
	console.log(value);
})

var p2 = Promise.resolve(123);
p2.then(value => {
	console.log(p2);
})
5. Promise.reject()方法:(reason) => {}

reason:失败的原因。

  • 案例:定义失败值为2的promise对象。
/*
	定义失败回调的数据
*/
var p3 = Promise.reject(456);
p3.then(null, reason => {
	console.log(reason);
})
 
// 或
p3.catch(reason => {
	console.log(456);
})
6. Promise.all()方法:(promises) => {}

promises:多个promise数组。

  • 作用:返回一个新的promise对象,当数组中的所有promise对象都执行成功,才为成功,只要数组中有一个promise对象执行失败,就为失败。
<script>
	/*
		Promise数组中只有全部成功获取数据才会成功回调,
		只要有一个失败获取数据就失败回调
	*/
	var p1 = Promise.resolve(1);
	var p2 = Promise.resolve(2);
	var p3 = Promise.resolve(3);
	var p4 = Promise.reject(4);
	
	var pAll = Promise.all(p1,p2,p3);
	pAll.then(values => {
		// 成功调用
		console.log('成功' + values);
	},reason => {
		// 失败调用
		console.log('失败' + reason);
	})
</script>
7.Promise.race()方法:(promises) => {}

promises:多个promise对象的数组。

  • 作用:返回一个新的promise对象。第一个完成promise的状态就是最终的结果状态。
    <script>
		/*	
			Promise.race()获取最先执行的状态
			Promise数组中是同步顺序执行,谁放在最前面谁先执行。
		*/
		var p1 = Promise.resolve(1);
		var p2 = Promise.resolve(2);
		var p3 = Promise.resolve(3);
		var p4 = Promise.reject(4);
		
		var rach = Promise.race([p1,p2,p3,p4]);
		pAll.then(values => {
			// 成功调用
			console.log('成功' + values);
		},reason => {
			// 失败调用
			console.log('失败' + reason);
		})
		
	</script>

1.4.5 async与await

asyncawait 是编写异步操作的解决方案,也是建立在promise基础上的新写法,两者同时使用,如果在方法中使用了await,那么在方法前面加上async。 await必须写在async函数中,但async函数中可以没有await。

<script>
	/*	
		1、async修饰函数的返回值是Promise对象
		2、Promise对象的结果成功或失败由async函数的返回值决定
	*/
	async function f1(){
		return 'hello'
		// return Promise.reject(123);
	}
	var res = f1()
	console.log(res);  // Promise object
	
	// 获取Promise对象中数据
	res.then(value => {
		console.log('成功==' + value);
	}, reason => {
		console.log('失败==' + reason);
	})
</script>
1、async函数

A. async()函数使用
作用:返回promise对象。async的右侧是一个函数,函数的返回值是promise对象。

  • (1) async函数的返回值为promise对象。
  • (2) promise对象的结果,由async函数执行的返回值决定。

vue2安装axios,NodeJs,await,async,Promise,resolve,reject

async function fn1(){
	return "hello async"
}
const res = fn1()
console.log(res)  // Promise object

如果fn1()函数前面不加async,毫无疑问,res的打印结果应该是hello async,加上async之后将打印promise对象。
既然返回的是promise对象,获取数据就要使用.then方法,并且要设置成功的回调函数和失败的回调函数。

B. then()函数获取成功回调值

async function fn1(){
	return "hello async"
}
const res = fn1()
res.then(
	value => {
		console.log('成功的回调:' + value)
	},
	reason => {
		console.log('-------------' + reason)
	}
)

vue2安装axios,NodeJs,await,async,Promise,resolve,reject
运行代码,此时在.then中执行的是成功的回调函数。

C. 回调失败返回
加上async之后,返回的是promise对象,我们也可以直接在fn1函数中设置返回失败的数据。

async function fn1(){
	return Promise.reject('失败的数据')
}
const res = fn1()
res.then(
	value => {
		console.log('成功的回调:' + value)
	},
	reason => {
		console.log('-------------' + reason)
	}
)

vue2安装axios,NodeJs,await,async,Promise,resolve,reject

2、await表达式

作用:等待async函数执行完成,并返回async函数成功的值。文章来源地址https://www.toymoban.com/news/detail-755546.html

<script>
	/*	
		await作用可以直接获取async函数的值
		await必须要在async函数中
		await只能用于获取成功的数据,不能用于获取失败的数据。可以使用try...catch...来捕捉获取失败的值
	*/
	async function f1(){
		return 'hello';
		// return Promise.reject(123); // await获取会报错
	}
	
	async function f2(){
		try{
			var res = await f1();
			console.log(res);  // hello
		}catch(error){
			console.log(error);
		}
	}
	f2();
</script>

到了这里,关于【Vue框架】Vue2中axios发送请求—安装axios、配置全局域名、传递参数、axios原理之Promise(什么是Promise、使用原因、基本使用、相关API、async与await使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue使用axios发送get请求并携带参数

    其实关于Vue使用axios发送get请求并携带参数,我之前写过一篇,但是昨天又发现了另外一种方式,所以就单独写一篇进行总结。 之前写的那篇使用get请求并携带参数都是使用的字符串拼接的方式 感兴趣可以参考: Vue使用axios进行get请求拼接参数的两种方式 关于如何使用安装

    2023年04月10日
    浏览(59)
  • 再vue项目中使用axios原生发送post请求

    前言:在大多数项目开发中,都是采用前后端分离架构,在此情况下都采用一些成熟的框架,类似于ruoyi,因为成熟所以前端的请求都进行了各种封装,有时想单独发起一个简单的请求,还有点麻烦,因此记录一下。 因为是前后端分离,当前前端使用的端口是81,后端运行的

    2024年02月14日
    浏览(49)
  • vue2使用axios封装请求数据,教会你封装,简单易懂,轻松学会axios封装请求数据 看一眼就会 手把手教会

    2、完成上面的步骤还不够,还需要再创建一个文件夹api,然后在文件夹里面创建自定义的文件名(我创建的是cartApi.js)文件名根据自己的需求命名 下面就是根据自己的请求接口以及数据参数请求,下面的请求是一些常见的post、get请求以及传参啥的(仅供参考,可以参考下面

    2024年01月24日
    浏览(57)
  • axios全局封装取消请求,你可以创建一个 Axios 实例,并为该实例配置默认的 CancelToken

    可以在你的应用中使用这个封装过的 Axios 实例,并通过调用 instance.cancelAll() 方法来取消所有未完成的请求。

    2024年02月04日
    浏览(44)
  • 前端vue2中axios封装请求数据,教会你封装教会你请求数据 简单易懂,轻松学会axios封装请求数据 看一眼就会 手把手教会

    2、完成上面的步骤还不够,还需要再创建一个文件夹api,然后在文件夹里面创建自定义的文件名(我创建的是cartApi.js)文件名根据自己的需求命名 下面就是根据自己的请求接口以及数据参数请求,下面的请求是一些常见的post、get请求以及传参啥的(仅供参考,可以参考下面

    2024年02月03日
    浏览(49)
  • Axios基本使用,为学习后续的Vue服务【发送请求+并发请求+前端拦截器】

    目录 1、项目中引入Axios 2、使用Axios发送请求 2.1、例:发送GET请求 2.2、例:发送POST请求 3、axios并发请求 4、拦截器 注:个人学习笔记,因自己学过后端,所以有关后端的代码,我在这里就不展示了~ 不了解后端的宝子,也不会耽误学习,因为公司里会有写好的接口文档,直

    2024年02月02日
    浏览(52)
  • vue2前端使用axios发起post请求,后端(springboot)拿不到值解决办法

    axios封装-我常用的请求头参数  application/json; charset=utf-8 页面登录请求-post 网络请求正常传入参数 后端代码,查看控制台发现都为null,没取到值。 1.尝试将前端post请求改成get,其他都不用变 发现正常取到值,打印输出正常。前端页面正常跳转。 2.后端设置为post请求,前端a

    2024年02月02日
    浏览(49)
  • VUE项目使用axios发送post跨域请求,返回数据失败问题

    Access to XMLHttpRequest at \\\'http://xxxx\\\' from origin \\\'http://localhost:8080\\\' has been blocked by CORS policy: Response to preflight request doesn\\\'t pass access control check: No \\\'Access-Control-Allow-Origin\\\' header is present on the requested resource. 第一步 ,在后端接受方,对返回的数据添加 响应头 ,使用下面这句代码: 第二步

    2024年02月11日
    浏览(52)
  • react通过axios发送请求并演示配置多个反向代理地址解决跨域

    这里 我们准备一个接口 我这里用java写了一个 然后 我们打开react项目 安装axios 然后在src下创建一个setupProxy.js 编写代码如下 可以看到 这里我们配了两个方向代理 如果请求的路中 包含api 就会代理成 http://localhost:8080/请求路径 如果包含user则会成为 http://localhost:808/请求路径 这

    2023年04月10日
    浏览(52)
  • Vue2 axios 发请求报400错误 “Error: Request failed with status code 400“

    最近在做一个项目,后端写了一个登录接口,postman可以正常请求。但我axios发请求出现400错误 \\\"Error: Request failed with status code 400\\\" 请求: 错误:  我研究了两天,查了无数资料,最后和朋友一起找到解决方法 原因:后端没跟我说需要什么格式的数据,我以为是默认的json,后来

    2024年02月11日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包