首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Vue。如何封装Axios以减少请求代码冗余

关于Vue。如何封装Axios以减少请求代码冗余
EN

Stack Overflow用户
提问于 2022-03-20 10:00:56
回答 2查看 196关注 0票数 0

现在我正在使用the编写一个项目,我使用了很多Axios请求,如何封装请求代码以减少冗余。

代码语言:javascript
复制
getProvinces() {
  this.axios
    .get(this.gv.serverUrl + "/location/province/list")
    .then((res) => {
      this.location.province.provinces = res.data.data;
    });
},
getCities() {
  this.axios
    .get(this.gv.serverUrl + "/location/city/list", {
      params: {
        pid: this.location.province.province,
      },
    })
    .then((res) => {
      this.location.city.cities = res.data.data;
    });
},
getCountries() {
  this.axios
    .get(this.gv.serverUrl + "/location/country/list", {
      params: {
        cid: this.location.city.city,
      },
    })
    .then((res) => {
      this.location.country.countries = res.data.data;
    });
},
EN

回答 2

Stack Overflow用户

发布于 2022-03-20 14:13:16

使用Axios.all执行并发请求。这将帮助您封装所有请求的状态。不完全是这样,但如下所示:

代码语言:javascript
复制
let endpoints = [
  'https://this.gv.serverUrl + "/location/province/list"',
  'https://this.gv.serverUrl + "/location/city/list"',
  'https://api.github.com/users/ejirocodes/followers',
  'https://api.github.com/users/ejirocodes/following'
];
axios.all(endpoints.map((endpoint) => axios.get(endpoint))).then(
     (data) => console.log(data),
)

下面是获得更多帮助和更好解释的链接:https://blog.logrocket.com/using-axios-all-make-concurrent-requests/

票数 1
EN

Stack Overflow用户

发布于 2022-03-20 12:56:01

您可以创建一个方法来进行axios调用,传递路径和参数(作为可选参数)。因此,您所提供的代码可以使用的方法是:

代码语言:javascript
复制
fetch(resource, params) {
  return this.axios.get(this.gv.serverUrl + `/location/${resource}/list`, { params })

这个fetch方法将返回一个承诺,您的方法如下所示:

代码语言:javascript
复制
getProvinces() {
  this.fetch("/location/province/list")
    .then((res) => {
      this.location.province.provinces = res.data.data;
    });
},
getCities() {
  this.fetch("/location/city/list", { pid: this.location.province.province })
    .then((res) => {
      this.location.city.cities = res.data.data;
    });
},
getCountries() {
  this.fetch("/location/country/list", { cid: this.location.city.city})
    .then((res) => {
      this.location.country.countries = res.data.data;
    });
},

如果Vue实例的数据属性存在某种一致性,则可以进行进一步的重构。我看不到数据属性的形状,但从我所看到的情况看,它如下所示:

代码语言:javascript
复制
data() {
  return {
    location: {
       province: {
         provinces: [...],
       },
       city: {
         cities: [...],
       },
       country: {
         countries: [...],
       },
    }
  }
}

如果你能把它修改成这样的话:

代码语言:javascript
复制
data() {
  return {
    location: {
       province: {
         list: [...],
       },
       city: {
         list: [...],
       },
       country: {
         list: [...],
       },
    }
  }

那么方法的重构可以是这样的:

代码语言:javascript
复制
fetch(resource, params) {
  return this.axios
    .get(this.gv.serverUrl + `/location/${resource}/list`, { params })
    .then((res) => {
      this.location[resource].list = res.data.data;
    })

getProvinces() {
  this.fetch("/location/province/list")
},
getCities() {
  this.fetch("/location/city/list", { pid: this.location.province.province })
},
getCountries() {
  this.fetch("/location/country/list", { cid: this.location.city.city})
},
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71545745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档