Vueでaxiosをカプセル化するいくつかの方法

Vueでaxiosをカプセル化するいくつかの方法

ベーシックエディション

ステップ1: Axiosを構成する

まず、axios 構成とインターセプターを保存する Service.js を作成し、最後に axios オブジェクトをエクスポートします。私は通常 elementUI をより頻繁に使用しますが、ここで独自の UI ライブラリを使用することもできます。

'axios' から axios をインポートします
'element-ui' から { Message, Loading } をインポートします
const ConfigBaseURL = 'https://localhost:3000/' //デフォルトのパス。envを使用して環境を決定することもできます。let loadingInstance = null //ここでは読み込み中です。
//createメソッドを使用してaxiosインスタンスを作成します export const Service = axios.create({
  timeout: 7000, // リクエストタイムアウト baseURL: ConfigBaseURL,
  メソッド: 'post'、
  ヘッダー: {
    'コンテンツタイプ': 'application/json;charset=UTF-8'
  }
})
// リクエストインターセプターを追加する Service.interceptors.request.use(config => {
  loadingInstance = Loading.service({
    ロック: 真、
    テキスト: '読み込み中...'
  })
  設定を返す
})
// レスポンスインターセプターを追加する Service.interceptors.response.use(response => {
  ロードインスタンスを閉じる()
  // console.log(応答)
  応答データを返す
}, エラー => {
  console.log('TCL: エラー', エラー)
  const msg = error.Message !== undefined ? error.Message : ''
  メッセージ({
    メッセージ: 'ネットワークエラー' + メッセージ、
    タイプ: 'エラー'、
    期間: 3 * 1000
  })
  ロードインスタンスを閉じる()
  Promise.reject(error) を返します。
})

特定のインターセプター ロジックは、特定のビジネスによって異なります。ここにはロジックはなく、グローバル ロードを追加しただけです。

ステップ2: リクエストをカプセル化する

ここで、特定のリクエストを含む別の request.js を作成します。

'./Service' から {Service} をインポートします。
エクスポート関数 getConfigsByProductId(productId) {
  戻り値 Service({
    url: '/manager/getConfigsByProductId',
    パラメータ: { 製品ID: 製品ID }
  })
}
エクスポート関数 getAllAndroidPlugins() {
  戻り値 Service({
    url: '/manager/getAndroidPlugin',
    メソッド: 'get'
  })
}
エクスポート関数 addNewAndroidPlugin(data) {
  戻り値 Service({
    url: '/manager/addAndroidPlguin',
    データ: JSON.stringify(データ)
  })
}

もちろん、URL を再度カプセル化して別のファイルに入れることもできます。これは意味がなく、複雑さが増すだけだと思います。ここで注意すべき主な点は、命名の問題です。機能に応じて名前を付けることをお勧めします。たとえば、ここではリクエストメソッド + 関数またはコンテンツ + パラメータを使用します。このように、getConfigsByProductId という名前も非常に明確です。

ステップ3: 使用

Vueコンポーネントでは

'@/api/request.js' から {getAllAndroidPlugins、getConfigsByProductId、addNewAndroidPlugin} をインポートします。

すべてのAndroidプラグインを取得する()
.then(res=>{

})

main.js でのグローバル使用

'@/api/Service.js' から {Service} をインポートします。
Vue.prototype.$axios=サービス

上級バージョン

vue cliのアップグレードに伴い、core-js\babelやその他の依存関係もアップグレードされました。これでasync/awaitを自由に使用できるようになりました。したがって、このカプセル化は、以前のPromiseをasync awaitにアップグレードするためのものです。まず、それはまだ同じです。まずaxiosをカプセル化します

//サービス.js
'axios' から axios をインポートします
const ConfigBaseURL = 'https://localhost:3000/' // デフォルトのパス。env を使用して環境を決定することもできます // create メソッドを使用して axios インスタンスを作成します export const Service = axios.create({
  timeout: 7000, // リクエストタイムアウト baseURL: ConfigBaseURL,
  メソッド: 'post'、
  ヘッダー: {
    'コンテンツタイプ': 'application/json;charset=UTF-8'
  }
})
// リクエストインターセプターを追加する Service.interceptors.request.use(config => {
  設定を返す
})
// レスポンスインターセプターを追加する Service.interceptors.response.use(response => {
  // console.log(応答)
  応答データを返す
}, エラー => {
  Promise.reject(error) を返します。
})

この時点で、axios オブジェクトを取得しました。次に、非同期エラーの処理に主に使用される一般的なライブラリ、await-to-js をお勧めします。 コードは上から続きます。

'await-to-js' からインポート
エクスポート関数isObj(obj) {
  const typeCheck = typeof obj!=='undefined' && typeof obj === 'object' && obj !== null 
  戻り値 typeCheck && Object.keys(obj).length > 0
}
非同期関数_get(url, qs,headers)をエクスポートします。
  定数パラメータ = {
    URL、
    メソッド: 'get'、
    パラメータ: qs ? qs : ''
  }
  if (headers) { params.headers = headers }
  const [err, res] = await to(Service(params))
  もし (!err && res) {
    戻り値
  } それ以外 {
    console.log(err) を返します
  }
}

get をカプセル化する場合は、パラメータのみを考慮し、await-to-js を使用して待機中のエラーをキャプチャし、成功した場合にのみデータを返し、エラーが発生した場合はインターセプターを使用します。

非同期関数_get(url, qs,headers)をエクスポートします。
  定数パラメータ = {
    URL、
    メソッド: 'get'、
    パラメータ: isObj(qs) ? qs: {}
  }
  if (isObj(headers)) {params.headers = headers}
  const [err, res] = await to(Service(params))
  もし (!err && res) {
    戻り値
  } それ以外 {
    console.log(err) を返します
  }
}

これは私がパッケージ化した投稿です

非同期関数_post(url, qs, body)をエクスポートします。
  定数パラメータ = {
    URL、
    メソッド: 'post'、
    パラメータ: isObj(qs) ? qs: {},
    データ: isObj(body) ? 本文: {}
  }
  const [err, res] = await to(Service(params))
  もし (!err && res) {
    戻り値
  } それ以外 {
    console.log(err) を返します
  }
}

使用時に直接導入することも、複数回カプセル化することもできます。

//a.vue
<スクリプト>
'./Service' からインポート{_get}
エクスポートデフォルト{
	方法:{
    	非同期テスト(){
        const res = _get('http://baidu.com') を待機します
       }
    }
}
</スクリプト>

上記は、Vue で Axios をカプセル化するいくつかの方法の詳細です。Vue で Axios をカプセル化する詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • TypeScript を使用して Vue3 で axios をカプセル化する詳細な例
  • Vueでaxiosをカプセル化する方法
  • Vueでaxiosを簡単にカプセル化する方法
  • axiosリクエストをvueでカプセル化する方法
  • Vue における AXIOS カプセル化の詳細な説明

<<:  デプロイから基本操作までDocker Swarm

>>:  Centos7.5 は mysql5.7.24 バイナリ パッケージの展開をインストールします

推薦する

APPログインインターフェースシミュレーション要求を実装するためのPostmanデータ暗号化と復号化

目次主に使用されるPostmanの機能データの暗号化と復号化さまざまなパラメータ設定実際に送信された...

Nodejs 配列キューと forEach アプリケーションの詳細な説明

この記事では、Nodejs 開発プロセスで遭遇する配列の特性によって発生する問題と解決策、および配列...

CocosCreator システムイベントがどのように生成され、トリガーされるかについての詳細な説明

目次環境まとめモジュール機能関連文書ソースコード分析CCGame.js CCInputManager...

Linux リモート コントロール Windows システム プログラム (3 つの方法)

場合によっては、Windows システム上のプログラムを Linux 上でリモートで実行する必要があ...

シングルサインオン制御を実装するためのVueの完全なコード

参考までに、Vue シングル サインオンのデモをご紹介します。詳細を知りたい方のお役に立てれば幸いで...

Dockerコンテナのネットワークポート設定プロセスの詳細な説明

ネットワークポートの公開実際、Docker にはネットワーク ポートの公開に関わる 2 つのパラメー...

Vue.jsクラウドストレージで画像アップロード機能を実現

序文ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。 1. オブジェクトスト...

UnityはMySQLに接続し、テーブルデータの実装コードを読み取ります

表は以下のとおりです。 Unity が読み取って呼び出すときのコード: データベース内の別のテーブル...

HTML+JS に基づくシンプルな年齢計算ツールの実装

目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...

純粋な CSS 実装 (スクリプトなし) HTML コマンド スタイルのツールチップ テキスト プロンプト効果

実行プロセスを分析します。マウスをノードに移動して、ノードにツールチップ実装を開くための識別子 (...

Dockerはelasticsearchイメージを起動し、ディレクトリをマウントした後にエラーを解決します

docker hub から es イメージ (バージョン 6.4.2) をダウンロードしました。詳細...

Linux の一般的な基本コマンドと使用方法

この記事では、一般的な基本的な Linux コマンドとその使用方法を例を使って説明します。ご参考まで...

MySQLはJSON内部フィールドを抽出し、数値としてダンプします

目次背景問題分析1. 属性値はJson形式であり、Json操作関数を使用して処理する必要があります。...

一般的なDockerコマンドの概要

Dockerのインストール1. 要件: Linuxカーネルバージョン3.10以上 表示: uname...

Vue 要素と Nuxt の使用に関するヒントを共有する

1. 要素時間選択提出フォーマット変換例えば 2018年9月7日金曜日 00:00:00 GMT+0...