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

Web-Unterrichtspläne, Unterrichtspläne für Anfänger

Unterrichtsthemen Webseite Anwendbare Klasse Zwei...

MySQL 8.X Installations-Tutorial unter Windows

Zuvor habe ich MySQL 5.7 verwendet, aber da MySQL...

Detailliertes Tutorial zum Bereitstellen von Apollo mit Docker

1. Einleitung Ich werde hier nicht näher auf Apol...

Lösung zur Codeaufteilung im Vue-Projekt

Inhaltsverzeichnis Hintergrund Zweck Vor der Spal...

So installieren Sie Theano und Keras auf einem Ubuntu-System

Hinweis: Das System ist Ubuntu 14.04LTS, ein 32-B...

Eine kurze Analyse zum besten Umgang mit vergessenen MySQL 8-Passwörtern

Vorwort Leser, die mit MySQL vertraut sind, werde...

Fünf Möglichkeiten zum automatischen Seitensprung in HTML

Im vorherigen Artikel haben wir drei gängige Meth...

Eine detaillierte Einführung in die Linux-Systemkonfiguration (Dienststeuerung)

Inhaltsverzeichnis Vorwort 1. Systemdienststeueru...

So implementieren Sie geplante MySQL-Aufgaben zur Datensicherung unter Linux

Vorwort Backup ist die Grundlage der Notfallwiede...

Was soll ich tun, wenn ich die Quelldatei einer Webseite nicht anzeigen kann?

F: Wenn Sie Outlook oder IE verwenden, wird beim ...

Detaillierte Analyse der Unterschiede zwischen break und last in Nginx

Lassen Sie uns zunächst über den Unterschied spre...

MySQL SHOW PROCESSLIST unterstützt den gesamten Prozess der Fehlerbehebung

1. SHOW PROCESSLIST-Befehl SHOW PROCESSLIST zeigt...