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

So erlauben Sie allen Hosts den Zugriff auf MySQL

1. Ändern Sie den Host-Feldwert eines Datensatzes...

Detaillierte Beschreibung des MySQL-Ersetzens in der Verwendung

Die Ersetzungsanweisung ähnelt im Allgemeinen der...

Schritt-für-Schritt-Anleitung zum Erstellen einer Kalenderkomponente mit React

Inhaltsverzeichnis Betriebswirtschaftlicher Hinte...

So finden Sie Websites mit SQL-Injection (unbedingt lesen)

Methode 1: Verwenden Sie die erweiterte Suche von...

Beispielcode zur Installation von Jenkins mit Docker

Zwei Probleme, die bei der Installation von Docke...

Verwendung des Array-Filters filter() in JS

Inhaltsverzeichnis 1. Einleitung 2. Einführung in...

So zeigen Sie den Prozentsatz und die ersten paar Prozent in MySQL an

Inhaltsverzeichnis Erfordern Implementierungscode...

So ändern Sie die Container-Portzuordnung in Docker dynamisch

Vorwort: Die Docker-Portzuordnung erfolgt häufig,...

So erstellen Sie eine Datenbank in Navicat 8 für MySQL

Beim Entwickeln einer Website müssen Sie häufig e...

So installieren und implementieren Sie MySQL 8.0 unter CentOS8

Die offizielle Version 8.0.11 von MySQL 8 wurde v...

Beispielcode zum Hervorheben von Suchbegriffen im WeChat-Miniprogramm

1. Einleitung Wenn Sie im Projekt auf eine Anford...

Grundlegende Befehle für MySQL-Datenbankoperationen

1. Erstellen Sie eine Datenbank: Daten erstellen ...