为了减少项目对第三方框架的依赖,我们不会在每个文件中都对其引入,而是在一个文件中将其封装为一个自定义的方法,然后在项目中使用该自定义方法。这样如果某一天这个第三方框架不再维护、被抛弃以后,只需要对封装的文件进行修改。

 

由于不同网络请求的配置不同,特别是当服务器是分布式、代理式的时,可能baseURL都不一样。所以我们为不同的请求创建不同的axios实例,使用axios.create()方法,参数为一个配置对象:

const instance = axios.create({
    baseURL: 'http://xxxxxxxx',
    timeout: 5000
})

在发送请求、接受响应的过程中可以使用拦截器来加工请求配置、响应数据,注意加工完后一定记得再return回去:

instance.interceptors.request.use(config => {
    return config
  }, err => {
    console.log(err)
})
instance.interceptors.response.use(res => {
    return res.data
  }, err => {
    console.log(err)
})

比如,当用户访问某些深层内容时,可以先拦截该请求并检查用户是否登录(请求配置中是否有token),如果没有,通过修改url跳转到登录页面。

比如,网络请求的结果中除了要使用的数据,还有许多axios添加的相关配置,我们可以拦截该结果,然后只返回要使用的数据。(比如上面代码)

将该axios实例instance和拦截器封装到一个自定义函数request中,将instance()执行结果作为该函数的返回值。由于执行结果为一个promise对象,所以在使用时可以直接通过.then方法来处理请求到的数据。

完整代码如下:

import axios from 'axios'

export function request(config){
  const instance = axios.create({
    baseURL: 'http://152.136.185.210:7878/api/m5',
    timeout: 5000
  })
  instance.interceptors.request.use(config => {
    return config
  }, err => {
    console.log(err)
  })
  instance.interceptors.response.use(res => {
    return res.data
  }, err => {
    console.log(err)
  })
  return instance(config)
}

所以,在调用request函数时,只需要传一个给axios的配置对象即可,该对象通常包含五个参数:url、method、params(url参数)、headers、data(请求体参数)。除了url,其它均为可选值。

getHomeMultidata(){
  return request({
    url: '/home/multidata'
  })
}
    getHomeMultidataUSE() {
      getHomeMultidata().then((res) => {
        this.banners = res.data.banner.list;
        this.recommends = res.data.recommend.list;
      });
    }

这里再次进行了一次封装,只是为了将请求的url单独拿出来,修改方便。

那什么时候发送请求呢?答案是当当前组件被创建以后。所以在created()生命周期钩子函数中调用  this.getHomeMultidataUSE()  即可,同时调用的还有 this.getHomeGoodsUSE (),它是用来获取商品列表信息的方法,其内容更为复杂。

注意到在请求成功的then回调中,我们保存了banners数组和recommends数组,它们其实就是轮播图组件和推荐图片组件中使用的图片。

 

posted on 2021-06-25 00:57  springxxxx  阅读(63)  评论(0编辑  收藏  举报