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 のグリッドプロパティの使用に関する詳細な説明

推薦する

Windows での MySQL 8.0.15 の詳細なインストールと使用のチュートリアル

この記事では、MySQL 8.0.15の詳細なインストールと使用方法のチュートリアルを参考までに紹介...

Centos8 で NIS ドメイン サービスをセットアップおよび構成するための詳細な手順

目次NIS の紹介ネットワーク環境: 1. 環境の準備(両方のノードが必要) 2.nisマスターサー...

MySQL で単一のフィールド内の複数の値を分割および結合する方法

複数の値を組み合わせて表示これで、図1から図2に示す要件が揃いました。 どうやってやるんですか?次の...

HTMLコードに基づく画像断片化読み込み機能の実装

今日は断片化された画像の読み込み効果を実装します。効果は次のとおりです。 これを 3 つのステップで...

Rails APIを使用してReactアプリケーションを構築するための詳細な手順

目次バックエンド: Rails API部分フロントエンド: React部分Reactコンポーネントa...

フラットスタイルを使用してウェブサイトをデザインする方法

フラットなウェブサイト構造の本質はシンプルさです。コンテンツの重要なポイントを強調し、ページの装飾効...

Mysqlは隣接リスト(隣接リスト)を通じてツリー構造を保存します。

以下の内容では、隣接リストを使用してツリー構造を保存する MYSQL のプロセスとソリューションを紹...

JavaScriptは文字の出現回数をカウントします

この記事の例では、文字の出現回数をカウントするJavaScriptの具体的なコードを参考までに共有し...

Alibaba Cloud Ubuntu 16.04でpptpdサービスを構築する方法

1. PPTP VPNを構築するには、ポート1723とGREプロトコルを開く必要があります。 1. ...

美容・スタイリングウェブサイト向けのカラーマッチングテクニックと効果表示

色はあらゆるウェブサイトにとって最も重要な要素の 1 つであり、閲覧者に大きな影響を与えるため、色の...

Linux bash: ./xxx: バイナリ ファイルを実行できません エラー

今日、Ubuntu 用の小さなツールを顧客に送りましたが、ユーザーはそれを受け取った後、実行できませ...

MySQL でデータを削除してもテーブル ファイルのサイズが変更されないのはなぜですか?

長期間稼働しているデータベースの場合、テーブルがストレージ領域を占有しすぎるという問題がよく発生しま...

HTML で入力ボックスに純粋な数字のみを入力するように制限する方法

inputボックスを純粋な数字のみに制限する1、onkeyup = "value=valu...