ホームページ  >  記事  >  ウェブフロントエンド  >  Axios リクエストを vue3 でカプセル化してコンポーネントで使用する方法は何ですか?

Axios リクエストを vue3 でカプセル化してコンポーネントで使用する方法は何ですか?

PHPz
PHPz転載
2023-05-21 10:49:191961ブラウズ

1. カプセル化された js を保存するフォルダーを作成します

#私は src/request/axios.js

Axios リクエストを vue3 でカプセル化してコンポーネントで使用する方法は何ですか?##2 に作成しました。カプセル化コードは次のとおりです。次のように

次のコードを request.js に直接コピーし、get リクエストと post リクエストをカプセル化します。

自分で設定する必要があるのは、独自のリクエスト アドレス、tokenKey がトークンであるかどうか、およびそれを次のように変更することです。ローカルに保存し、トークン名、

はコード内のコメントを見るとわかりやすいです。

/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from 'axios';
import QS from 'qs';
import router from '../router/index'
//qs.stringify()是将对象 序列化成URL的形式,以&进行拼接
//  let protocol = window.location.protocol; //协议
//  let host = window.location.host; //主机
//  axios.defaults.baseURL = protocol + "//" + host;
axios.defaults.baseURL = 'http://localhost:8888'
 
axios.interceptors.request.use( //响应拦截
        async config => {
            // 每次发送请求之前判断vuex中是否存在token        
            // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
            // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 
            config.headers.token = sessionStorage.getItem('token')
            return config;
        },
        error => {
            return Promise.error(error);
        })
    // 响应拦截器
axios.interceptors.response.use(
    response => {
        if (response.status === 200) {
            return Promise.resolve(response); //进行中        
        } else {
            return Promise.reject(response); //失败       
        }
    },
    // 服务器状态码不是200的情况    
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登录                
                // 未登录则跳转登录页面,并携带当前页面的路径                
                // 在登录成功后返回当前页面,这一步需要在登录页操作。                
                case 401:
                    break
                    // 403 token过期                
                    // 登录过期对用户进行提示                
                    // 清除本地token和清空vuex中token对象                
                    // 跳转登录页面                
                case 403:
                    sessionStorage.clear()
                    router.push('/login')
                    break
                    // 404请求不存在                
                case 404:
                    break;
                    // 其他错误,直接抛出错误提示                
                default:
            }
            return Promise.reject(error.response);
        }
    }
);
/** 
 * get方法,对应get请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
const $get = (url, params) => {
        return new Promise((resolve, reject) => {
            axios.get(url, {
                    params: params,
                })
                .then(res => {
                    resolve(res.data);
                })
                .catch(err => {
                    reject(err.data)
                })
        });
    }
    /** 
     * post方法,对应post请求 
     * @param {String} url [请求的url地址] 
     * @param {Object} params [请求时携带的参数] 
     */
const $post = (url, params) => {
        return new Promise((resolve, reject) => {
            axios.post(url, QS.stringify(params)) //是将对象 序列化成URL的形式,以&进行拼接   
                .then(res => {
                    resolve(res.data);
                })
                .catch(err => {
                    reject(err.data)
                })
        });
    }
    //下面是vue3必须加的,vue2不需要,只需要暴露出去get,post方法就可以
export default {
    install: (app) => {
        app.config.globalProperties['$get'] = $get;
        app.config.globalProperties['$post'] = $post;
        app.config.globalProperties['$axios'] = axios;
    }
}
3. Configuration

main.js に、最初のステップでカプセル化した js を導入し、use()

//引入封装Axios请求
import Axios from './request/axios';
 
const app = createApp(App).use(VueAxios, axios).use(ElementPlus).use(router).use(Axios)

4. 必要な部分で使用します。コンポーネント

ここで重要です。パッケージングが完了しました。最終的にはそれを使用する必要があります。コンポーネントに

getCurrentInstance をインポートします。次のコードを追加します。

import {  getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
  function logout(){
    proxy.$post("/sysStaff/logout",{}).then((response)=>{
      console.log(response)
      if(response.code == 200){
        sessionStorage.clear();
        router.push('/')
        ElMessage({
          message: '退出成功',
          type: 'success',
        })
      }
    })
  }
呼び出し時には、パラメータが 2 つあります。最初のパラメータはパスで、2 番目のパラメータはオブジェクトであり、送信するパラメータを書き込むことができます (例: ユーザー名: shuaibi) 、パスワード:123456。

補足: 特定の構成によるクロスドメインの問題 CORS の解決

サードパーティ パッケージの webpack-dev-server をインストールします

インストールしない場合は、 devServer 設定項目がない場合は、インストールする必要があります。

npm install webpack-dev-server

ルート ディレクトリに次の設定を書き込みます。 vue.config.js

module.exports = {
  // 关闭语法检查
  lintOnSave: false,
  // 解决axios发送请求时的跨域问题,不做配置会报错如下↓↓↓↓
  // ccess to XMLHttpRequest at 'http://127.0.0.1:23456/webPage/home_notice.post' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  devServer: {
    // https: false,
    proxy: {
      //  /api 表示拦截以/api开头的请求路径
      "/webPage": {
        target: "http://127.0.0.1:23456/", // 跨域的域名(不需要重写路径)
        ws: false, // 是否开启websockede
        changeOrigin: true, // 是否开启跨域
        // pathRewrite: {
        //   "^/webPage": "",
        // },
      },
    },
  },
};

ブラウザが 1 つのドメイン名の Web ページを要求するが、必要な場合は、これら 2 つのドメイン名、ポート、またはプロトコルが同じである限り、別のドメイン名のリソースを取得します。これらのいずれかが異なる場合、クロスドメインとみなされます。ここでは詳しい説明はありませんが、詳しく知りたい場合は情報を確認してください。

    devServer 構成アイテムにより、リバース プロキシを有効にしてクロスドメインの問題を解決できます。以前のすべてのアドレス スプライシングを取得できます
  1. /webPage/cooperater.post... リクエストが最終的に開始されるときに、pathRewrite が書き込まれていない場合は、/webPage を検索し、その前にターゲット内のアドレスをスプライシングすることを意味します。ほとんどの場合、http://127.0.0.1:23456/webPage/cooperater.post へのリクエストが開始されます。


    ##pathRewrite: {"^/webPage": "***",}、ルートの書き換えによって /webPage が ***
  2. に置き換えられることを示します

以上がAxios リクエストを vue3 でカプセル化してコンポーネントで使用する方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。