当前位置:   article > 正文

Vue中axios完整用法_vue中的axios

vue中的axios

如果没了解过 axios 建议先看 axios 的基本用法再看此文章会更好!

首先安装 axios

 npm i axios -S
  • 1

安装不成功可以在后面加上 --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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在另一个组件发起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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

如果其他组件也要使用axios发请求,就会发现这样非常的繁琐,每次都要导入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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

所以在组件时候可以这样使用:

<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

所以组件使用 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
了解直接将 axios 挂载到原型上的缺点

缺点是无法实现 api 接口的复用,就是接口不止一个的时候,无法实现复用

// 这里已经写死了,不止一个接口时,显然就不行了
// 全局配置 axios 的请求根路径
axios.defaults.baseURL = 'http://www.liulongbin.top:3006'
  • 1
  • 2
  • 3

所以我们不用这样的方式来配置,但要知道有这样的配置方式

推荐方法

思路就是把每一个不同的接口进行分开,以实现接口的复用,如:
在 src 的 utils(工具)文件夹里
接口1,放在 request1.js
接口2:放在 request2.js
在这里插入图片描述

开始实操:在utils 文件夹创建

在这里插入图片描述

import axios from 'axios'

// 调用 axios.create() 函数,创建一个 axios 的实例对象,用 request 来接收
const request = axios.create({
  // 指定请求的路径
  baseURL: 'https://www.escook.cn'
})

export default request
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
在组件中使用(了解可跳)
<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
问题又来了,那其他组件 调用 request.js 不得重复写 await 后面的 Promise 对象,没有达到复用性?

故在 src 目录下创建 api 文件夹,把相关请求写成可复用的 api

// 文章相关的 API 接口都封装到这个模块中
import request from '@/utils/request'

// 向外按需导出一个 API 函数
export const getArticleListAPI = function(_page, _limit) {
  return request.get('/articles', {
    // 请求参数
    params: {
      _page,
      _limit
    }
  })
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
组件改成
<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

把相关的 API 接口都封装到这一个 API 中,这样不就简洁了吗

参考资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/465996
推荐阅读
相关标签
  

闽ICP备14008679号