TypeScript を使用して Vue3 で axios をカプセル化する詳細な例

TypeScript を使用して Vue3 で axios をカプセル化する詳細な例

この axios パッケージは、vue3 デモで使用されます。便宜上、element-plus は vue3 構成でオンデマンドでロードされます。

Axios のカプセル化

ts は

'axios' から axios、{ AxiosRequestConfig、AxiosRequestHeaders、AxiosResponse } をインポートします。
'@/types' から { IResponseData } をインポートします。
'element-plus' から { ElMessage、ElLoading、ILoadingInstance } をインポートします。

タイプTAxiosOption = {
  ベースURL: 文字列;
  タイムアウト: 数値;
}

定数設定 = {
  ベースURL: '/',
  タイムアウト: 120000
}

読み込み: ILoadingInstance;

クラスHttp {
  //サービス: AxiosInstance;
  サービス;
  コンストラクタ(config: TAxiosOption) {
    this.service = axios.create(config)

    /* リクエストのインターセプション this.service.interceptors.request.use(config => config, error => Promise.reject(error))*/
    this.service.interceptors.request.use((config: AxiosRequestConfig) => {
      /* ビジネスロジック 1. 全画面読み込みアニメーションを有効にする 2. データ暗号化 config.data
      3. vuex または localstorage と組み合わせて、リクエスト ヘッダーにトークンを追加します。
          store.getters.token の場合、config.headers['x-token'] は store.getters.token になります。
          それ以外の場合は 4 をリダイレクトします。…
      */
      読み込み = ElLoading.service({
        ロック: 真、
        テキスト: '読み込み中'、
        スピナー: 'el-icon-loading',
        背景: 'rgba(255, 255, 255, 0.7)',
      })

      localStorage.getItem('トークン') の場合 {
        (config.headers を AxiosRequestHeaders として)。authorization = localStorage.getItem('token') を文字列として
      }

      設定を返す
    }, エラー => {
      /* リクエストエラー 1. 全画面読み込みアニメーションを閉じる 2. エラーページにリダイレクトする */
      読み込み中.閉じる()
      return Promise.reject(error) // コード内でエラーメッセージをキャッチするため})


    /* レスポンスのインターセプション this.service.interceptors.response.use(response => response.data, error => Promise.reject(error))*/
    this.service.interceptors.response.use((レスポンス: AxiosResponse<any>) => {
      /* 
      1. 全画面読み込みアニメーションを閉じる 2. データの復号化 3. response.data.code に基づいて異なるエラー処理を実行する 4. …
      */
      読み込み中.閉じる()

      定数データ = レスポンス.データ
      const { コード } = データ

      (コード !== '000000') の場合 {
        ElMessage.error(データ.メッセージ)
        Promise.reject(データ) を返す
      }
      応答データを返す
    }, エラー => {
      読み込み中.閉じる()
      ElMessage.error('リクエストが失敗しました',)
      Promise.reject(error) を返します。
    })
  }
  get<T>(url: 文字列、params?: オブジェクト、_object = {}): Promise<IResponseData<T>> {
    this.service.get(url, { params, ..._object }) を返します
  }
  post<T>(url: 文字列、params?: オブジェクト、_object = {}): Promise<IResponseData<T>> {
    this.service.post(url, params, _object) を返します
  }
  put<T>(url: 文字列、params?: オブジェクト、_object = {}): Promise<IResponseData<T>> {
    this.service.put(url, params, _object) を返します
  }
  削除<T>(url: 文字列、パラメータ?: 任意、_object = {}): Promise<IResponseData<T>> {
    this.service.delete(url, { params, ..._object }) を返します
  }
}

デフォルトの新しいHttp(config)をエクスポートします

types/index.ts: インターフェースによって返されるデータの型定義

エクスポートインターフェースIResponseData<T> {
  ステータス: 番号;
  メッセージ?:文字列;
  データ:T;
  コード: 文字列;
}

アクシオスの使用

リスト.vue:

const { data } = http.get<IList>('/goods/list', queryForm.value) を待機します list.value = data.list

<テンプレート lang="pug">
//- クエリフォーム
el-form(:inline="true" :model="queryForm" size="small" label-position="left")
  el-フォーム項目
    el-button(type="primary" @click="operate")
      | el-form-item(label="製品番号") を追加
    el-input(v-model="queryForm._id")
  el-form-item(label="製品名")
    el-input(v-model="queryForm.goodName")
  el-form-item(ラベル="数量")
    el-input(v-model="queryForm.count")
  el-form-item(label="詳細")
    el-input(v-model="queryForm.des")
  el-フォーム項目
    el-button(type="primary" @click="query")
      | クエリ //- リスト el-table(:data="list" center size="mini")
  el-table-column(prop="goodName" label="製品名")
  el-table-column(prop="count" label="quantity")
  el-table-column(prop="des" label="詳細")
  el-table-column(ラベル="操作")
    テンプレート(#default="props")
      el-button(type="primary" size="small" @click="operate(props.row)")
        | 編集 el-button(type="danger" size="small" @click="operate(props.row, true)")
        | 削除 //- 追加、編集 el-drawer(v-model="detailShow" :title="editShow === true ? 'Edit' : 'Add'" direction="rtl")
  el-form(:model="detailForm" size="small" label-width="80px" label-position="left")
    //- el-form-item(label="製品番号" 必須 v-if="false")
    el-form-item(label="製品番号" 必須 v-if="log(editShow)")
      el-input(v-model="detailForm._id" 読み取り専用)
    el-form-item(label="製品名" 必須) 
      el-input(v-model="detailForm.goodName")
    el-form-item(ラベル="数量")
      el-input(v-model="detailForm.count")
    el-form-item(label="詳細")
      el-input(v-model="detailForm.des")
    el-フォーム項目
      el-button(type="primary" size="small" @click="送信")
        | OK</テンプレート>

<script lang="ts">
'vue' から {defineComponent、reactive、ref} をインポートします。
'element-plus' から { ElMessage } をインポートします
'@/types/goods' から { IGoodInfo, IList } をインポートします。
'@/http' から http をインポートします

エクスポートデフォルトdefineComponent({
  名前: 'ホーム'、
  設定() {
    const リスト = ref<IGoodInfo[]>([])

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

    クエリ()


   	非同期関数クエリ(){
      const { data } = http.get<IList>('/goods/list', queryForm.value) を待機します。
      リスト.値 = データ.リスト
    }

    非同期関数operate(form?: IGoodInfo, flag?: true) {
      if (!form) {
        詳細表示値 = true
        editShow.value = false
        detailForm.value = { goodName: ''、count: ''、_id: ''、des: '' }
      } それ以外の場合 (!フラグ) {
        詳細表示値 = true
        editShow.value = true
        detailForm.value = { ...フォーム }
      } それ以外 {
        http.delete('/goods/delete', { _id: form._id }) を待機します
        クエリ()
      }
    }

    非同期関数submit() {
      (detailForm.value._id) の場合 {
        http.put('/goods/edit', detailForm.value) を待機します。
      }それ以外{
        http.put('/goods/edit', detailForm.value) を待機します。
      }

      detailShow.value = false
      エルメッセージ({
        メッセージ: 「操作は成功しました」
        タイプ: '成功'、
      })
      クエリ()
    }


    関数 log(params:any) {
     console.log(パラメータ);
     パラメータを返す
    }

    戻る {
      詳細表示、
      編集表示、
      リスト、
      クエリフォーム、
      詳細フォーム、
      クエリ、
      操作する、
      提出する、
      ログ
    }
  }
});
</スクリプト>

タイプ/商品.ts

エクスポートインターフェースIGoodInfo {
  _id: 文字列;
  goodName: 文字列;
  カウント: 文字列;
  des: 文字列
}

エクスポートインターフェースIList {
  リスト: IGoodInfo[]
}

これで、Typescript を使用して axios をカプセル化する方法についての説明は終わりです。Typescript カプセル化に関するその他の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3 + TypeScript 開発の概要
  • Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録
  • vue3+TypeScript+vue-routerの使い方
  • Vue3 TypeScriptはuseRequestの詳細を実装します

<<:  MySQLデュアルマスター(マスターマスター)アーキテクチャ構成ソリューション

>>:  CSS のグリッドプロパティの使用に関する詳細な説明

推薦する

CSSで検索ボックスを非表示にする機能を実装します(アニメーション順方向と逆方向のシーケンス)

上部のメニュー バーに検索ボックスを配置するのは一般的なシナリオですが、検索機能がそれほど頻繁に使用...

Centos 6.5 での mysql-community-server. 5.7.18-1.el6 のインストール

次のコマンドを使用して、MySQL Serverがインストールされているかどうかを確認します。 [r...

Dockerは異常なコンテナ操作を排除する

この初心者は、Docker を学び始めたばかりの頃にこのような問題に遭遇しました。記録しておきます。...

Reactは二次連結(左右連結)を実現する

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...

TypeScriptの列挙型を詳しく説明する

目次1. デジタル列挙2. 文字列の列挙3. 逆マッピング4. 異種列挙5. 定数列挙6. 列挙メン...

Alpine Dockerイメージフォント問題解決操作

1. フォントを実行し、フォント フォルダーを開いて、使用するフォント ファイルを見つけます。 2....

CentOS7で新しいデータディスクをマウントするための完全な手順

序文新しい VPS を購入しました。新しい VPS のデータ ディスクはデフォルトではシステムにマウ...

three.js を使って立体的な矢印線を描く詳細な手順

需要: この需要は緊急に必要です!地下鉄のシーンでは、脱出経路を示す矢印を描かなければなりません。こ...

HTML tbody の使用

構造化テーブル (IExplore のみ) 1) 行ごとにグループ化<thead> .....

Html+CSS 描画三角形アイコン

まずはレンダリングを見てみましょう: XML/HTML コードコンテンツをクリップボードにコピー&l...

Vue でルーティング遷移効果を実装する 4 つの方法

Vue ルーター トランジションは、Vue プログラムにパーソナライズされたエフェクトをすばやく簡単...

nginx ベースのブラウザネゴシエーションキャッシュプロセスの詳細な説明

この記事は主に、nginx に基づいてブラウザネゴシエーションキャッシュを設定する詳細なプロセスを紹...

Linux trコマンドの使い方

01. コマンドの概要tr コマンドは、標準入力からの文字を置換、圧縮、削除できます。ある文字セット...

Nodejsはgitee実装コードに自動的に同期するドキュメント同期ツールを作成します

本来の意図このツールを作った理由は、コンピューターを使用しているときにいつでも毎日の仕事や生活を記録...