axios挂载到vue项目中一些优化问题

简介: axios挂载到vue项目中一些优化问题

1.准备工作


用vue cli创建一个vue项目,然后再components目录下创建两个vue组件,分别是Right.vue和Left.vue。文件的代码如下

Right.vue


<template>
<div class="right-container">
  <h1>Right组件</h1>
</div>
</template>
<script>
export default {}
</script>
<style lang="less" scoped>
.right-container{
  background-color: skyblue;
  min-height: 200px;
  flex: 1;
}
</style>


Left.vue:


<template>
<div class="letf-container">
    <h1>Left组件</h1>
</div>
</template>
<script>
export default {}
</script>
<style lang="less" scoped>
.letf-container{
  background-color: orange;
  min-height: 200px;
  flex: 1;
}
</style>


然后再App.vue这个根组件里面使用这两个组件

App.vue:


<template>
  <div>
    <h1>App根组件</h1>
    <hr>
    <div class="box">
      <Left></Left>
      <Right></Right>
    </div>
  </div>
</template>
<script>
import Left from './components/Left.vue'
import Right from './components/Right.vue'
export default {
  components: {
    Left,
    Right
  }
}
</script>
<style lang="less" scoped>
.box{
  display: flex;
}
</style>


到这里,项目运行的效果如下:


87e802be5a4346388f9c8dd2bdff9c8f.png


然后,我们在项目下运行 npm i axios -S 来把axios导入到项目里面。

到这里准备工作就完成了。


2.具体案例


假设我们希望在Left组件里面有一个按钮,然后我们点击按钮可以发起一个请求。


在Left组件里面编写一个按钮发送get请求


<button @click="getInfo">发起GET请求</button>


然后我们需要在Left组件的<script>里面添加如下的代码:


<script>
import axios from 'axios'
export default {
  methods: {
    getInfo () {
      axios.get('http://www.liulongbin.top:3006/api/get').then(
        (res) => {
          console.log(res.data)
        }
      )
    }
  }
}
</script>


运行后点击发现GET请求没有问题:


3386e14ba2ac4f9d8c490768e99c153e.png


然后,假设我们希望在右侧的Right.vue组件里面希望点击按钮发起一个POST请求的话,我们添加如下的代码


<button @click="postInfo">发起POST请求</button>


<script>
import axios from 'axios'
export default {
  methods: {
    postInfo () {
      axios.post('http://www.liulongbin.top:3006/api/post', {name:'zs',age:20}).then(
        (res) => { console.log(res.data) }
      )
    }
  }
}
</script>


到这里,我们运行依旧没有问题:


01fceabe07ae411da777de9ae1f378c5.png


3.问题引出


我们会发现,每个组件中都有发送请求的需求,我们上面每个组件都要导入axios,并且发现请求的url地址都是http://www.liulongbin.top:3006开头,即项目的根路径相同。这些东西都要重复书写,比较麻烦。


4.解决方法–把axios挂载到Vue的原型上并配置请求根路径。


接下来,我们希望换一种方式来使用axios。之前我们每个组件中都要import导入axios,很麻烦。

之前学过,每一个点 .vue 组件都相当与是一个Vue实例。

既然是这样的话我们打开main.js文件,添加如下的代码:


import axios from 'axios'
Vue.prototype.$http = axios


这里的$http这个名字可以叫其他的名字,但我们一般都叫$http。


然后我们的组件里面就可以不用再import去导入axios了。直接this.h t t p . g e t 或 t h i s . http.get或this.http.get或this.http.post去调用就可以了。如下

Left.vue里面:


<script>
export default {
  methods: {
    getInfo () {
      this.$http.get('http://www.liulongbin.top:3006/api/get').then(
        (res) => {
          console.log(res.data)
        }
      )
    }
  }
}
</script>


Right.vue里面:


<script>
export default {
  methods: {
    postInfo () {
      this.$http.post('http://www.liulongbin.top:3006/api/post', { name: 'zs', age: 20 }).then(
        (res) => { console.log(res.data) }
      )
    }
  }
}
</script>


下面再来解决一下根路径的问题,我们发现url的根路径都是http://www.liulongbin.top:3006,以后如果根路径发生改变的话,那每一个.vue的组件的url路径都要改变,对以后的维护很不友好。

我们要在main.js里面添加如下的配置:


// 全局配置axios的请求根路径
axios.defaults.baseURL = 'http://www.liulongbin.top:3006'


之后组件中就不用再去写完整的请求地址了,如下

Right.vue:


<script>
export default {
  methods: {
    postInfo () {
      this.$http.post('/api/post', { name: 'zs', age: 20 }).then(
        (res) => { console.log(res.data) }
      )
    }
  }
}
</script>


Left.vue


<script>
export default {
  methods: {
    getInfo () {
      this.$http.get('/api/get').then(
        (res) => {
          console.log(res.data)
        }
      )
    }
  }
}
</script>


5.了解直接把axios挂在到Vue原型上的缺点


上面我说明了这中解决方法的好处,但是呢,也有缺点。

缺点就是 它无法实现API接口的复用。


下面来演示一下出现的问题:

在Right.vue里面点击button会发送post请求,如果在再Right.vue里面添加一个button用来获取图书列表的数据

添加的代码如下:


<script>
export default {
  methods: {
    postInfo () {
      this.$http.post('/api/post', { name: 'zs', age: 20 }).then(
        (res) => { console.log(res.data) }
      )
    },
    getBooks () {
      this.$http.post('/api/getbooks').then(
        (res) => { console.log(res.data) }
      )
    }
  }
}
</script>


如果这个获取图书列表的数据的api在多个组件里面使用,就要定义很多遍getBooks方法,就无法实现API接口的复用。



目录
打赏
0
0
0
0
5
分享
相关文章
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
198 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
42 0
乾坤qiankun框架搭建 主应用为vue3的项目。
乾坤qiankun框架搭建 主应用为vue3的项目。
494 2
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
170 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
261 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
193 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
205 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
Pinia 如何在 Vue 3 项目中进行安装和配置?
Pinia 如何在 Vue 3 项目中进行安装和配置?
299 4
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
275 12
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等