Detailliertes Beispiel für die Verwendung von Typescript zum Einkapseln von Axios in Vue3

Detailliertes Beispiel für die Verwendung von Typescript zum Einkapseln von Axios in Vue3

Dieses Axios-Paket wird in der Vue3-Demo verwendet. Der Einfachheit halber wird Element-Plus bei Bedarf in die Vue3-Konfiguration geladen.

Kapselung von Axios

http.ts

importiere axios, { AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse } von 'axios'
importiere { IResponseData } aus '@/types'
importiere { ElMessage, ElLoading, ILoadingInstance } von 'element-plus'

Typ TAxiosOption = {
  Basis-URL: Zeichenfolge;
  Zeitüberschreitung: Zahl;
}

const konfiguration = {
  Basis-URL: '/',
  Zeitüberschreitung: 120000
}

lass laden: ILoadingInstance;

Klasse Http {
  //Dienst: AxiosInstance;
  Service;
  Konstruktor(Konfiguration: TAxiosOption) {
    dieser.Dienst = axios.create(Konfiguration)

    /* Anforderungsabfangen this.service.interceptors.request.use(config => config, error => Promise.reject(error))*/
    this.service.interceptors.request.use((Konfiguration: AxiosRequestConfig) => {
      /* Geschäftslogik 1. Ladeanimation im Vollbildmodus aktivieren 2. Datenverschlüsselung config.data
      3. Fügen Sie dem Anforderungsheader ein Token hinzu, kombiniert mit vuex oder localstorage:
          wenn (store.getters.token) config.headers['x-token'] = store.getters.token
          sonst Weiterleitung 4. …
      */
      wird geladen = ElLoading.service({
        Sperre: wahr,
        Text: 'Wird geladen',
        Spinner: „el-icon-loading“,
        Hintergrund: 'rgba(255, 255, 255, 0.7)',
      })

      wenn (localStorage.getItem('token')) {
        (config.headers als AxiosRequestHeaders).authorization = localStorage.getItem('token') als Zeichenfolge
      }

      Konfiguration zurückgeben
    }, Fehler => {
      /* Anforderungsfehler 1. Vollbild-Ladeanimation schließen 2. Zur Fehlerseite weiterleiten */
      wird geladen.schließen()
      return Promise.reject(error) // Um ​​die Fehlermeldung im Code abzufangen})


    /* Antwortabfangen this.service.interceptors.response.use(response => response.data, error => Promise.reject(error))*/
    this.service.interceptors.response.use((Antwort: AxiosResponse<beliebig>) => {
      /* 
      1. Schließen Sie die Ladeanimation im Vollbildmodus. 2. Entschlüsseln Sie die Daten. 3. Führen Sie unterschiedliche Fehlerbehandlungen basierend auf response.data.code durch. 4. …
      */
      wird geladen.schließen()

      const data = antwort.data
      const { code } = Daten

      wenn (Code !== '000000') {
        ElMessage.error(Daten.Nachricht)
        returniere Promise.reject(Daten)
      }
      Antwortdaten zurückgeben
    }, Fehler => {
      wird geladen.schließen()
      ElMessage.error('Anforderung fehlgeschlagen',)
      returniere Promise.reject(Fehler)
    })
  }
  get<T>(url: string, params?: object, _object = {}): Promise<IResponseData<T>> {
    gibt this.service.get(url, { params, ..._object }) zurück
  }
  post<T>(url: string, params?: object, _object = {}): Promise<IResponseData<T>> {
    gib diesen.Dienst.Post zurück (URL, Parameter, _Objekt)
  }
  setze<T>(url: string, params?: object, _object = {}): Promise<IResponseData<T>> {
    gib this.service.put(URL, Parameter, _Objekt) zurück
  }
  löschen<T>(URL: Zeichenfolge, Parameter?: beliebig, _Objekt = {}): Promise<IResponseData<T>> {
    gib dies zurück.Dienst.Löschen(URL, {Parameter, ..._Objekt})
  }
}

exportiere standardmäßig neues Http(config)

types/index.ts: Typdefinition der von der Schnittstelle zurückgegebenen Daten

Schnittstelle IResponseData<T> exportieren {
  Status: Nummer;
  Nachricht?:Zeichenfolge;
  Daten:T;
  Code: Zeichenfolge;
}

Verwendung von Axios

Liste.vue:

const { data } = warte auf http.get<IList>('/goods/list', queryForm.value) list.value = data.list

<template lang="pug">
//- Anfrageformular
el-form(:inline="true" :model="queryForm" Größe="klein" label-position="links")
  el-form-item
    el-button(Typ="primär" @click="bedienen")
      | el-form-item(label="Produktnummer") hinzufügen
    el-input(v-model="queryForm._id")
  el-form-item(label="Produktname")
    el-input(v-model="queryForm.goodName")
  el-form-item(label="Menge")
    el-input(v-model="queryForm.count")
  el-form-item(label="Details")
    el-input(v-model="queryForm.des")
  el-form-item
    el-button(Typ="primär" @click="Abfrage")
      | Abfrage //- Liste el-table(:data="list" center size="mini")
  el-table-column(prop="goodName" label="Produktname")
  el-table-column(prop="Anzahl" label="Menge")
  el-table-column(prop="des" label="Details")
  el-table-column(Bezeichnung="Vorgang")
    Vorlage(#default="Requisiten")
      el-button(Typ="primär" Größe="klein" @click="operieren(props.row)")
        | El-Button bearbeiten (Typ = "Gefahr" Größe = "klein" @click = "Operate(props.row, true)")
        | Löschen //- Hinzufügen, bearbeiten el-drawer(v-model="detailShow" :title="editShow === true ? 'Bearbeiten' : 'Hinzufügen'" direction="rtl")
  el-form(:Modell="detailForm" Größe="klein" Beschriftungsbreite="80px" Beschriftungsposition="links")
    //- el-form-item(label="Produktnummer" erforderlich v-if="false")
    el-form-item(label="Produktnummer" erforderlich v-if="log(editShow)")
      el-input(v-model="detailForm._id" schreibgeschützt)
    el-form-item(label="Produktname" erforderlich) 
      el-input(v-model="detailForm.goodName")
    el-form-item(label="Menge")
      el-input(v-model="detailForm.count")
    el-form-item(label="Details")
      el-input(v-model="detailForm.des")
    el-form-item
      el-button(Typ="primär" Größe="klein" @click="senden")
        | OK</template>

<script lang="ts">
importiere { defineComponent, reaktiv, ref } von „vue“;
importiere { ElMessage } von 'element-plus'
importiere { IGoodInfo, IList } aus '@/types/goods'
importiere http von '@/http'

exportiere StandarddefiniereKomponente({
  Name: "Home",
  aufstellen() {
    const list = ref<IGoodInfo[]>([])

    const queryForm = ref({ goodName: '', count: '', _id: '', des: '' })
    const detailForm = ref({ goodName: '', count: '', _id: '', des: '' })
    const detailShow = ref(false)
    const editShow = ref(false)

    Abfrage()


   	asynchrone Funktion query() {
      const { data } = warte auf http.get<IList>('/goods/list', queryForm.value)
      Liste.Wert = Daten.Liste
    }

    asynchrone Funktion operabel (Form?: IGoodInfo, Flag?: true) {
      wenn (!form) {
        detailShow.value = true
        editShow.value = false
        detailForm.value = { goodName: '', Anzahl: '', _id: '', des: '' }
      } sonst wenn (!flag) {
        detailShow.value = true
        editShow.value = true
        detailForm.value = { ...Formular }
      } anders {
        warte auf http.delete('/goods/delete', { _id: form._id })
        Abfrage()
      }
    }

    asynchrone Funktion submit() {
      wenn (detailForm.value._id) {
        warte auf http.put('/goods/edit', detailForm.value)
      }anders{
        warte auf http.put('/goods/edit', detailForm.value)
      }

      detailShow.value = false
      ElMessage({
        Meldung: „Vorgang erfolgreich“,
        Typ: "Erfolg",
      })
      Abfrage()
    }


    Funktion log(params:any) {
     konsole.log(Parameter);
     Rückgabeparameter
    }

    zurückkehren {
      Detailanzeige,
      bearbeitenAnzeigen,
      Liste,
      Abfrageformular,
      detailFormular,
      Abfrage,
      arbeiten,
      einreichen,
      Protokoll
    }
  }
});
</Skript>

Typen/Waren.ts

Schnittstelle IGoodInfo exportieren {
  _id: Zeichenfolge;
  guterName: Zeichenfolge;
  Anzahl: Zeichenfolge;
  des: Zeichenfolge
}

Exportschnittstelle IList {
  Liste: IGoodInfo[]
}

Dies ist das Ende dieses Artikels über die Verwendung von Typescript zur Kapselung von Axios. Weitere verwandte Inhalte zur Typescript-Kapselung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Vue3 + TypeScript-Entwicklungszusammenfassung
  • Praktischer Bericht über die Entwicklung von Vue3- und TypeScript-Projekten
  • So verwenden Sie vue3+TypeScript+vue-router
  • Vue3 TypeScript implementiert useRequest-Details

<<:  Konfigurationslösung für die MySQL Dual-Master-Architektur (Master-Master)

>>:  Detaillierte Erklärung zur Verwendung von Rastereigenschaften in CSS

Artikel empfehlen

Linux verwendet join -a1, um zwei Dateien zusammenzuführen

Um die folgenden beiden Dateien zusammenzuführen,...

MySQL-Datenbank implementiert OLTP-Benchmark-Test basierend auf Sysbench

Sysbench ist ein hervorragendes Benchmark-Tool, d...

Kalendereffekt basierend auf jQuery

In diesem Artikelbeispiel wird der spezifische Co...

So implementieren Sie die Unschärfefunktion von DIV

Verwenden Sie Anti-Shake, um DIV verschwinden zu ...

Detaillierte Erklärung des JS-Speicherplatzes

Inhaltsverzeichnis Überblick 1. Stapeln und Aufhä...

Informieren Sie sich, wie HTML und Ressourcen geladen werden

Der gesamte Inhalt dieses Blogs ist unter Creativ...

Codebeispiel für die Linux-SSH-Serverkonfiguration

Verwenden Sie den folgenden Terminalbefehl, um de...

XHTML-Einführungstutorial: Anwendung von Tabellen-Tags

<br />Tabelle ist ein umständliches Tag in X...