axios封裝

為什么要對(duì)axios進(jìn)行封裝饰潜?
  • 實(shí)際開發(fā)過(guò)程中,我們項(xiàng)目可能會(huì)有大量接口和簸,因此我們寫代碼的時(shí)候囊拜,如果不進(jìn)行封裝,則會(huì)產(chǎn)生大量冗余代碼比搭,比如catch,還有就是大量的接口也會(huì)造成后期維護(hù)的麻煩
封裝通常包含幾個(gè)部分
  1. API的封裝冠跷,便于后期統(tǒng)一維護(hù)管理。
    不同類型的接口身诺,分門別類放入不同的文件進(jìn)行管理蜜托,然后把這些文件放入統(tǒng)一的文件夾里。例如霉赡,聯(lián)系人這個(gè)類型的接口橄务,我們就可以單獨(dú)放入一個(gè)文件,姑且命名為contactApi.js
const CONTACT_API = {
    // 獲取聯(lián)系人列表
    getContactList:{
        method:'get',
        url:'/contactList'
    },
    //新建聯(lián)系人 form-data
    newContactForm:{
        method:'post',
        url:'/contact/new/form'
    },
    //新建聯(lián)系人 application/json
    newContactJson: {
        method: 'post',
        url: '/contact/new/json'
    },
    //編輯聯(lián)系人
    editContact:{
        method:'put',
        url:'/contact/edit'
    },
    //刪除聯(lián)系人
    delContact:{
        method: 'delete',
        url: '/contact'
    }
}

export default CONTACT_API
  1. 對(duì)axios進(jìn)行封裝
import axios from 'axios'
import service from './contactApi'
import { Toast } from 'vant'

let instance = axios.create({
    baseURL:'http://localhost:9000/api',
    timeout:1000
})

const Http = {};  //包裹請(qǐng)求方法的容器

// 對(duì) service 進(jìn)行循環(huán)遍歷輸出不同的請(qǐng)求方法穴亏,也就是遍歷 CONTACT_API
// 下邊會(huì)將 請(qǐng)求格式/參數(shù) 進(jìn)行統(tǒng)一為 params蜂挪,isFormData,config
for(let key in service){
    let api = service[key]  //api包含url method

    Http[key] = async function(
        //方法接受的參數(shù)

        //參數(shù)1 --- 請(qǐng)求參數(shù)params
        // get請(qǐng)求的話嗓化,參數(shù)放到URL上
        // post棠涮、put、patch請(qǐng)求的話刺覆,對(duì)應(yīng)的參數(shù)是data
        // delete請(qǐng)求的話严肪,默認(rèn)放在URL上(當(dāng)然也可以放在data)
        params, 

        //參數(shù)2 --- isFormData 標(biāo)識(shí)是否是 form-data 請(qǐng)求,默認(rèn)不是
        isFormData = false, 
        
        //參數(shù)3 --- config 配置參數(shù)谦屑,可以在這里設(shè)置 headers驳糯、params、data等
        config = {}  
    ){
        //聲明新變量氢橙,判斷content-type是否是form-data時(shí)候的參數(shù)的轉(zhuǎn)換
        let newParams = {}

        // 判斷 content-type 是否是 form-data
        if(params && isFormData){
            newParams = new FormData()  //創(chuàng)建一個(gè)form-data格式的對(duì)象
            for(let i in params){
                newParams.append(i,params[i])
            }
        }else{
            //不是form-data 
            newParams = params
        }

        // 不同請(qǐng)求的判斷
        let response = {};  //請(qǐng)求的返回值
        if (api.method === 'post' || api.method === 'put' || api.method === 'patch'){
            try{
                response = await instance[api.method](api.url, newParams,config)
            }catch(err){
                response = err
            }
        } else if (api.method === 'get' || api.method === 'delete'){
            config.params = newParams
            try {
                response = await instance[api.method](api.url, config)
            } catch (err) {
                response = err
            }
        }
        return response  //返回響應(yīng)值
    }
}

//請(qǐng)求攔截器
instance.interceptors.request.use(
    config => {
        //發(fā)起請(qǐng)求前做什么
        //加一個(gè)動(dòng)態(tài)更新提示
        Toast({
            duration: 0, // 持續(xù)展示 toast
            forbidClick: true,  //是否禁止背景點(diǎn)擊
            message: '加載中...'
        })
        return config
    },
    () => {
        //請(qǐng)求錯(cuò)誤
        Toast.clear()  //因?yàn)門oast是一直展示的酝枢,所以請(qǐng)求錯(cuò)誤時(shí)需要關(guān)掉toast
        Toast('請(qǐng)求錯(cuò)誤,請(qǐng)稍后重試')
    }
)

//響應(yīng)攔截器
instance.interceptors.response.use(
    //響應(yīng)成功
    res => {
        Toast.clear() 
        return res.data
    },
    () => {
        Toast.clear() 
        Toast('請(qǐng)求錯(cuò)誤悍手,請(qǐng)稍后重試')
    }
)

export default Http
  1. 掛載到Vue原型上(main.js里操作),之所以要掛載帘睦,是為了不在每個(gè)頁(yè)面都進(jìn)行 import axios from 'axios' 這樣類似的操作了袍患,掛載之后,全局可用官脓。
    image.png
  2. 改造聯(lián)系人代碼
<template>
  <div class="home">
    <!-- 聯(lián)系人列表 -->
    <van-contact-list
        :list="list"
        @add="onAdd"
        @edit="onEdit"
    />

    <!--  聯(lián)系人編輯-->
    <van-popup v-model="showEdit" position="bottom">
        <van-contact-edit
            :contact-info="editingContact"
            :is-edit="isEdit"
            @save="onSave"
            @delete="onDelete"
        />
    </van-popup>
  </div>
</template>

<script>
import axios from 'axios'
import { ContactList,ContactEdit,Toast,Popup} from 'vant';

export default {
  name: 'ContactList',
  components:{
      [ContactList.name]:ContactList,
      [ContactEdit.name]:ContactEdit,
      [Popup.name]:Popup
  },
  data(){
      return {
        //   {
        //       id:'',
        //       name:'',
        //       tel:''
        //   }
          list:[],
          instance:null,  //axios實(shí)例
          showEdit:false, //編輯彈窗的顯隱
          editingContact:{},  //正在編輯的聯(lián)系人數(shù)據(jù)
          isEdit:false,    //新建或編輯
      }
  },
  created(){
    this.instance = axios.create({
        baseURL:'http://localhost:9000/api',
        timeout:1000
    })
    this.getContactList()
  },
  methods:{
      //獲取聯(lián)系人列表(改造后)
      async getContactList(){
        let res = await this.$Http.getContactList()
        this.list = res.data
      },
      //添加聯(lián)系人
      onAdd(){
          this.showEdit = true
          this.isEdit = false
      },
      //編輯聯(lián)系人
      onEdit(info){
          this.showEdit = true
          this.isEdit = true
          this.editingContact = info 
      },
      //保存聯(lián)系人
      async onSave(info){
          if(this.isEdit){
              //編輯保存
                let res = await this.$Http.editContact(info)
                if(res.code == 200){
                    Toast('編輯成功')
                    this.showEdit = false
                    this.getContactList()
                }
          }else{
              //新建保存
              //傳的3個(gè)參數(shù)协怒,第二個(gè)應(yīng)該傳false,因?yàn)槟J(rèn)是false,所以可以不寫,config也不需要傳
                let res = await this.$Http.newContactJson(info)
                if(res.code == 200){
                    Toast('新建成功')
                    this.showEdit = false
                    this.getContactList()
                }

                //form-data格式
                // let res = await this.$Http.newContactForm(info,true)
                // if(res.code == 200){
                //     Toast('新建成功')
                //     this.showEdit = false
                //     this.getContactList()
                // }
          }
      },
      //刪除聯(lián)系人人
      async onDelete(info){
          let res = await this.$Http.delContact({
                  id:info.id
          })
          if(res.code == 200){
              Toast('刪除成功')
              this.showEdit = false
              this.getContactList()
          }
      }
  }
}
</script>

<style scoped>
.van-popup {
    height:40%
}
</style>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卑笨,一起剝皮案震驚了整個(gè)濱河市孕暇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赤兴,老刑警劉巖妖滔,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異桶良,居然都是意外死亡座舍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門陨帆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曲秉,“玉大人,你說(shuō)我怎么就攤上這事疲牵〕卸” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵纲爸,是天一觀的道長(zhǎng)亥鸠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)识啦,這世上最難降的妖魔是什么负蚊? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮颓哮,結(jié)果婚禮上家妆,老公的妹妹穿的比我還像新娘。我一直安慰自己题翻,他們只是感情好揩徊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嵌赠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熄赡。 梳的紋絲不亂的頭發(fā)上姜挺,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音彼硫,去河邊找鬼炊豪。 笑死凌箕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的词渤。 我是一名探鬼主播牵舱,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缺虐!你這毒婦竟也來(lái)了芜壁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤高氮,失蹤者是張志新(化名)和其女友劉穎慧妄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剪芍,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塞淹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罪裹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饱普。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖状共,靈堂內(nèi)的尸體忽然破棺而出套耕,到底是詐尸還是另有隱情,我是刑警寧澤口芍,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布箍铲,位于F島的核電站,受9級(jí)特大地震影響鬓椭,放射性物質(zhì)發(fā)生泄漏颠猴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一小染、第九天 我趴在偏房一處隱蔽的房頂上張望翘瓮。 院中可真熱鬧,春花似錦裤翩、人聲如沸资盅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呵扛。三九已至,卻和暖如春筐带,著一層夾襖步出監(jiān)牢的瞬間今穿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工伦籍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓝晒,地道東北人腮出。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像芝薇,于是被迫代替她去往敵國(guó)和親胚嘲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • vue中Axios的封裝和API接口的管理 我們所要的說(shuō)的axios的封裝和api接口的統(tǒng)一管理洛二,其實(shí)主要目的就是...
    chang_遇見緣閱讀 19,967評(píng)論 6 138
  • 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(四): Axios封裝 有很多同學(xué)看了本系列的前幾篇之后建議我暫時(shí)先不用TS...
    周小肆閱讀 6,277評(píng)論 3 20
  • 一馋劈、axios的封裝 在vue項(xiàng)目中,和后臺(tái)交互獲取數(shù)據(jù)這塊灭红,我們通常使用的是axios庫(kù)侣滩,它是基于promise...
    FE_study閱讀 574評(píng)論 0 1
  • 安裝依賴 安裝axios npm i axios 安裝qs npm i qs 封裝 【utils/request....
    瞌睡大伯父閱讀 1,667評(píng)論 3 17
  • 好像很久很久不為自己寫東西了吧,在那個(gè)剛有QQ的年代偶爾會(huì)有一兩篇走心的日志如今似乎也塵封好久無(wú)從追憶了吧变擒。嗯...
    小小莫0507閱讀 502評(píng)論 4 1