vue中api统一管理

简介: 【10月更文挑战第4天】

针对小型项目
无需管理的情况下

<script>
import axios from 'axios';
export default {
   
  methods: {
   
    async request() {
   
      let data = {
   }
      try {
   
        // host指的是请求的域名,path指的是请求的路径, data是相关的参数和请求头配置
        let res = await axios.post(`${
     host}${
     path}`, {
   
          data
        })
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }
    }
  }
}
</script>

统一api.js文件管理
将所有的api的接口信息都写在一个js文件里去维护。页面接口请求直接引入即可

在根目录下创建api文件夹,然后创建index.js

export default {
   
  getInfo: 'https://xxx.x.com/getinfo'
}

具体页面使用

<script>
import axios from 'axios';
import api from '@/api/index';
export default {
   
  methods: {
   
    async request() {
   
      let data = {
   }
      try {
   
        let res = await axios.post(api.getInfo, {
   
          data
        })
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }

    }
  }
}
</script>

针对非小型项目
api统一管理 + 挂载到vue实例上 + 单模块
思路:在api统一管理时,不仅仅管理请求地址,而是直接写一个request的请求方法,通过接受一些参数来实现多变性。
api/index.js

import request from '@/utils/axios'
export default {
   
  getInfo(params) {
   
    return request({
   
      url: '/xxx/xxx/xxx',
      method: 'post/get',
      params, // 如果是get请求的话
      data: params // 如果是post请求的话
    })
  }
}

在main.js里

import Vue from 'vue'
import App from './App.vue'
import api from '@/api/index';
Vue.prototype.$api = api;
Vue.config.productionTip = false
new Vue({
   
  render: h => h(App),
}).$mount('#app')

页面上得使用

<script>
import HelloWorld from './components/HelloWorld.vue'
import api from '@/api/index';
export default {
   
  methods: {
   
    async request() {
   
      let data = {
   }
      try {
   
        let res = await this.$api.getInfo(data)
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }
    }
  }
}
</script>

api统一管理 + 挂载到vue实例上 + 多模块
优点:可以在任意位置调用接口
缺点:如果接口数量足够大,挂载到vue实例上得数据过多,可能会造成性能问题
api/modules/account.js

import account from '@/utils/axios'
export default {
   
  getInfo(params) {
   
    return request({
   
      url: '/xxx/xxx/xxx',
      method: 'post/get',
      params, // 如果是get请求的话
      data: params // 如果是post请求的话
    })
  }
}

api/index.js

import account from './modules/account'
export default {
   
  account
}

在main.js里

import Vue from 'vue'
import App from './App.vue'
import api from '@/api/index';
Vue.prototype.$api = api;
Vue.config.productionTip = false
new Vue({
   
  render: h => h(App),
}).$mount('#app')

页面上的使用

<script>
import HelloWorld from './components/HelloWorld.vue'
import api from '@/api/index';
export default {
   
  methods: {
   
    async request() {
   
      let data = {
   }
      try {
   
        let res = await this.$api.account.getInfo(data)
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }
    }
  }
}
</script>

api统一管理 + vuex + 单模块
思路:api统一管理的方式不变,但是由挂载到vue实例上改成vuex 优点:在不挂载到vue实例的基础上可以在任何页面随意调用任何接口 缺点:为了保证在刷新页面不会报错的情况下就需要在api模块写一个接口配置,同时在store模块也需要写一次,比较繁琐。
在api/index.js的写法不变。
main.js中的相关挂载代码删除
store/index.js

import Vue from 'vue';
import Vuex from 'vuex';
import api from '@/api/index';
Vue.use(Vuex);
export default new Vuex.Store({
   
  action: {
   
    getInfo(store, params) {
   
      return api.getInfo(params)
    }
  }
})

在页面中

<script>
export default {
   
  methods: {
   
    async request() {
   
      let data = {
   }
      try {
   
        let res = await this.$store.dispatch('getInfo', data)
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }
    }
  }
}
</script>

当然你也可以使用mapActions

<script>
import {
    mapActions } from 'vuex';
export default {
   
  methods: {
   
    ...mapActions([ 'getInfo' ])
    async request() {
   
      let data = {
   }
      try {
   
        let res = await this.getInfo(data)
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }
    }
  }
}
</script>

api统一管理 + vuex + 多模块
优点:可以在页面的任何位置进行调用 缺点:新增删除修改同一个接口,需要同时维护两个文件
对于api文件而言,此时各个模式是相互独立的:api/account.js

import request from '@/utils/axios'
export default {
   
  getInfo(params) {
   
    return request({
   
      url: '/xxx/xxx/xxx',
      method: 'post/get',
      params, // 如果是get请求的话
      data: params // 如果是post请求的话
    })
  }
}

store/modules/account.js

import api from '@/api/account';
export default {
   
    namespaced: true,
    actions: {
   
        getInfo(store, params) {
   
          return api.getInfo(params)
        }
    }
}

store/index.js

import Vue from 'vue';
import Vuex from 'vuex';
import account from './modules/account';
Vue.use(Vuex);
export default new Vuex.Store({
   
  modules: {
   
      account
  }
})

在页面中

<script>
export default {
   
  methods: {
   
    async request() {
   
      let data = {
   }
      try {
   
        let res = await this.$store.dispatch('account/getInfo', data)
        console.log(res)
      } catch(err) {
   
        this.$message.error(err.message)
      }
    }
  }
}
</script>
相关文章
|
4月前
|
前端开发 JavaScript 安全
入门Vue+.NET 8 Web Api记录(一)
入门Vue+.NET 8 Web Api记录(一)
162 4
|
6月前
|
JavaScript 前端开发 测试技术
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
44 3
|
3月前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
47 4
|
5月前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
|
5月前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
|
4月前
|
开发框架 JavaScript .NET
Vue与ASP.NET Core Web Api设置localhost与本地ip地址皆可访问
Vue与ASP.NET Core Web Api设置localhost与本地ip地址皆可访问
51 0
|
5月前
|
开发框架 前端开发 应用服务中间件
部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
|
5月前
|
JavaScript 前端开发 定位技术
vue 使用 vue-jsonp 解决跨域请求问题(访问百度地图API)
vue 使用 vue-jsonp 解决跨域请求问题(访问百度地图API)
284 0
|
7月前
|
API
1天搞定SpringBoot+Vue全栈开发 (2)RESTful API与Swagger
1天搞定SpringBoot+Vue全栈开发 (2)RESTful API与Swagger
|
8天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
48 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
下一篇
DataWorks