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

Beispielanalyse zum Exportieren, Importieren und Kopieren von Docker-Images

Die erste Lösung besteht darin, das Bild in ein ö...

Grundlegender JSON-Betriebsleitfaden in MySQL 5.7

Vorwort Aufgrund der Projektanforderungen werden ...

Zusammenfassung der Implementierungsmethoden und Punkte der H5-Wakeup-APP

Inhaltsverzeichnis Vorwort Zur APP-Methode spring...

(MariaDB) Umfassende Erklärung der MySQL-Datentypen und Speichermechanismen

1.1 Übersicht über Datentypen Der Datentyp ist ei...

Detailliertes Tutorial zur Installation von MariaDB auf CentOS 8

Das Datenbankverwaltungssystem MariaDB ist ein Zw...

Detaillierter Installationsprozess und Prinzip des Vue-Routers

Inhaltsverzeichnis 1. Implementierungsprinzip des...

Beispielcode zur Verwendung der Elementkalenderkomponente in Vue

Schauen Sie sich zunächst das Wirkungsdiagramm an...

Verwendung von „Select“, „Distinct“ und „Limit“ in MySQL

Inhaltsverzeichnis 1. Einleitung 2. auswählen 2.1...

Zusammenfassung der MySQL-Zeichensätze

Inhaltsverzeichnis Zeichensatz Vergleichsregeln V...

So öffnen Sie Ports zur Außenwelt in Alibaba Cloud Centos7.X

Kurz gesagt: Wenn Sie einen Cloud-Server eines be...

So stellen Sie mit C++ eine Verbindung zu MySQL her

C++ stellt zu Ihrer Information eine Verbindung z...

Linux nutzt duale Netzwerkkartenbindung und Schraubendreherschnittstelle

Was ist eine Bindung? NIC-Bond ist eine Technolog...