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

推薦する

MySQL の主キーがクエリを高速化するために数値を使用するか UUID を使用するかについての簡単な分析

実際の開発では、MySQL の主キーは重複できず、主キーが自動的にインクリメントされることがあります...

Element-UI の Select と Cascader にポップアップ下部アクション ボタンを追加する方法

下図のように、 selectポップアップレイヤーの下部に操作ボタンを配置するのが一般的な設計方法です...

Windows システムに MySQL を素早くインストールして展開する方法 (グリーンの無料インストール バージョン)

まずは緑色の無料インストール版のMySQLをダウンロードします。任意のフォルダに入れて構いません。今...

Centos7 MySQL データベースのインストールと設定のチュートリアル

1. システム環境yum updateアップグレード後のシステムバージョンは[root@yl-web...

jQueryはフェードインとフェードアウト効果を実現します

jQuery を使用してフェードインとフェードアウト効果を完成させる前に、まずいくつかのコードを理解...

Linux システムでの vim プラグインのインストールの概要

目次vimプラグインマネージャーをインストールするプラグインデモを追加プラグインを削除するには: v...

CSS マルチレベルメニュー実装コード

これは、Web ページを Windows のスタート メニューなどのデスクトップ プログラムのように...

JSアルバム画像の揺れと拡大表示効果のサンプルコード

前回の記事では、JS を使って簡単な揺れ効果を実現する方法を紹介しました。ご興味があればクリックして...

JS はランダム点呼システムを実装します

参考までに、JSを使用してランダム点呼システムを実装します。具体的な内容は次のとおりです。毎回の授業...

Gobangゲームを実現するためのjsキャンバス

この記事では、Gobangゲームを実装するためのキャンバスの具体的なコードを参考までに共有します。具...

JavaScript のモジュール性の説明

目次序文: 1. コンセプト2. モジュール化の利点3. 複数のスクリプトタグを導入した後の問題1....

ウェブページ作成によく使われる英語フォント

アリアルArial は、多くの Microsoft アプリケーションとともに配布されるサンセリフ T...

CSS3は、大きな円のドット分布と回転効果を実現するためにtransform-originを使用します。

まず、transform-origin 属性を使用する必要があります。transform 属性は必ず...

MySQLの始め方から諦め方まで徹底解説 - インストール

学ぶ内容1. ソフトウェアのインストールとサーバーの設定。 2. (オプションですが、強くお勧めしま...

私が遭遇したIE8の互換性に関する注意事項

1. IE8 の getElementById は id のみをサポートし、name はサポートしま...