赞
踩
npm i axios -S
安装不成功可以在后面加上 --force
安装完成后在组件
使用 axios
<template> <div> <button @click="getInfo">发起 GET 请求</button> </div> </template> <script> import axios from 'axios' export default { methods: { async getInfo() { const { data: res } = await axios.get('http://www.liulongbin.top:3006/api/get') console.log(res) } } } </script>
在另一个组件发起post
请求
<template> <div> <button @click="postInfo">发起 GET 请求</button> </div> </template> <script> import axios from 'axios' export default { methods: { async postInfo() { const { data: res } = await axios.post('http://www.liulongbin.top:3006/api/post', {name: 'zs', age: 20 }) console.log(res) } } } </script>
如果其他组件也要使用axios发请求,就会发现这样非常的繁琐,每次都要导入axios和写完整的地址
每一个.vue组件都相当于一个 Vue 的实例,可以理解为每一个.vue组件 都是new Vue这个构造函数得到的
所以可以在 main.js 里面进行这样的配置:
import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'
Vue.config.productionTip = false
//在原型上挂载一个axios的自定义属性
Vue.prototype.axios = axios
new Vue({
render: h => h(App)
}).$mount('#app')
所以在组件时候可以这样使用:
<template> <div> <button @click="getInfo">发起 GET 请求</button> </div> </template> <script> // import axios from 'axios' export default { methods: { async getInfo() { const { data: res } = await this.axios.get('http://www.liulongbin.top:3006/api/get') console.log(res) } } } </script>
this.axios
表示通过组件实例访问到它原型的 axios 这个属性
import Vue from 'vue' import App from './App.vue' import axios from 'axios' Vue.config.productionTip = false // 全局配置 axios 的请求根路径 axios.defaults.baseURL = 'http://www.liulongbin.top:3006' // 把 axios 挂载到 Vue.prototype 上,供每个 .vue 组件的实例直接使用 // Vue.prototype.axios = axios 其实我们一般都不叫axios,而是叫$http,因为Vue的内置成员都是以$开头的 Vue.prototype.$http = axios // 今后,在每个 .vue 组件中要发起请求,直接调用 this.$http.xxx // 但是,把 axios 挂载到 Vue 原型上,有一个缺点:不利于 API 接口的复用!!! new Vue({ render: h => h(App) }).$mount('#app')
所以组件使用 axios 简化成如下示例代码:
<template> <div> <button @click="getInfo">发起 GET 请求</button> </div> </template> <script> // import axios from 'axios' export default { methods: { async getInfo() { const { data: res } = await this.$http.get('/api/get') console.log(res) } } } </script>
缺点是无法实现 api 接口的复用,就是接口不止一个的时候,无法实现复用
// 这里已经写死了,不止一个接口时,显然就不行了
// 全局配置 axios 的请求根路径
axios.defaults.baseURL = 'http://www.liulongbin.top:3006'
所以我们不用这样的方式来配置,但要知道有这样的配置方式
思路就是把每一个不同的接口进行分开,以实现接口的复用,如:
在 src 的 utils(工具)文件夹里
接口1,放在 request1.js
接口2:放在 request2.js
import axios from 'axios'
// 调用 axios.create() 函数,创建一个 axios 的实例对象,用 request 来接收
const request = axios.create({
// 指定请求的路径
baseURL: 'https://www.escook.cn'
})
export default request
<template> <div> <button @click="getArticleList">发请求</button> </div> </template> <script> // 导入 request.js import request from '@/utils/request.js' export default { data() { return { page: 1, // er页码值。从 1 开始 limit: 10 // 每页展示的数据条数。 } }, methods: { async getArticleList () { // 获取文章列表数据 /articles 为请求url地址 const { data: res } = await request.get('/articles', { // 请求参数 params: { _page: this.page, _limit: this.limit } }) console.log(res) } } } </script>
故在 src 目录下创建 api 文件夹,把相关请求写成可复用的 api
// 文章相关的 API 接口都封装到这个模块中
import request from '@/utils/request'
// 向外按需导出一个 API 函数
export const getArticleListAPI = function(_page, _limit) {
return request.get('/articles', {
// 请求参数
params: {
_page,
_limit
}
})
}
<template> <div> <button @click="getArticleList">发请求</button> </div> </template> <script> // 按需导入 API 接口 import { getArticleListAPI } from '@/api/articleAPI' export default { data() { return { page: 1, // er页码值。从 1 开始 limit: 10 // 每页展示的数据条数。 } }, methods: { async getArt() { const { data: res } = await getArticleListAPI(this.page, this.limit) console.log(res) } } } </script>
把相关的 API 接口都封装到这一个 API 中,这样不就简洁了吗
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。