vue 項目中的this.$get,this.$post等$的用法

vue官網上有這麼一句話

結合案例:

//  基於axios 封裝的http請求插件
const axios = require('axios');

/**
 * 以下這種方式需要調用Vue.use方法 調用的時候調用 this.$fetch, this.$post, this.$axios, this.$put, this.$del 方法
 */
function coverFormData (data) {
  return Object.keys(data).map(key => {
    let value = data[key];
    if (typeof value === 'object') {
      value = JSON.stringify(value);
    }
    return encodeURIComponent(key) + '=' + encodeURIComponent(value);
  })
}
const http = {
  install(Vue, Option) {
    axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
    if (Option) {
      // 超時設置
      axios.defaults.timeout = Option.timeout || 10000;
      // 默認請求地址設置
      axios.defaults.baseURL = Option.baseURL || "";
      // 頭部設置
      if (Option.headers && typeof Option.headers === 'object') {
        for (let key in Option.headers) {
          if (!Option.headers.hasOwnProperty(key)) continue;
          axios.defaults.headers[key] = Option.headers[key];
        }
      }
      // 請求/響應攔截器
      Option.inRequest && axios.interceptors.request.use(Option.inRequest, error => {
          Promise.reject(error);
      });
      Option.inResponse && axios.interceptors.response.use(Option.inResponse, error => {
          Promise.reject(error);
      });
    }
    /**
     * @param  {string} url
     * @param  {object} params={}  參數可以根據需要自行處理
     */
    const fetch = (url, params = {}, config = {}) => {
      const str = coverFormData(params).join('&');
      return new Promise((resolve, reject) => {
        let address = url;
        if (str) {
          address += '?' + str;
        }
        axios.get(address, config).then(res => {
          resolve(res.data);
        }).catch(error => {
          reject(error);
        });
      });
    };

    /**
     * @param  {string} url
     * @param  {object} data={} 參數可以根據需要自行處理
    
     */
    const post = (url, data = {}, config = {}) => {
      let str = coverFormData(data).join('&');
      if (config.headers && config.headers['Content-Type'] && config.headers['Content-Type'].indexOf('application/json') > -1) {
        str = JSON.parse(JSON.stringify(data));
      }
      return new Promise((resolve, reject) => {
        axios.post(url, str, config).then(res => {
          resolve(res.data);
        }).catch(error => {
          reject(error);
        });
      });
    };

    /**
     * @param  {string} url
     * @param  {object} data={} 參數可以根據需要自行處理
     */
    const put = (url, data = {}, config = {}) => {
      const str = coverFormData(data).join('&');
      return new Promise((resolve, reject) => {
        axios.put(url, str, config).then(res => {
          resolve(res.data);
        }).catch(error => {
          reject(error);
        });
      });
    };

    /**
     * @param  {string} url
     * @param  {object} params={}
     */

    const del = (url, config = {}) => {
      const str = coverFormData(config).join('&');
      return new Promise((resolve, reject) => {
        axios.delete(url, str).then(res => {
          resolve(res.data);
        }).catch(error => {
          reject(error);
        });
      });
    };
    const data = { axios, fetch, post, put, del };
    // 這個地方說明了爲啥使用的時候是this.$fetch, this.$post, this.$axios, this.$put, this.$del 這幾個方式
    Object.keys(data).map(item => Object.defineProperty(Vue.prototype, '$' + item, { value: data[item] }));
  }
};

export default http;

 然後在main.js中導入包使用:

import http from './assets/js/http';

Vue.use(http, {
    timeout: 60000,
    inRequest (config) {
        config.headers['Authorization'] =
            sessionStorage.getItem('TokenType') +" "
            + sessionStorage.getItem('AccessToken');
        return config;
    }, 
    inResponse (response) {
        return response;
    }
});

 之後在子組件中就可以直接使用this.$post等了

比如:

this.$post("你的url", {
        CityId: cityid,
        Type: 3
      })
        .then(res => {
          if (res.Success) {
            this.searchSecondary = res.Data;
          }
        })
        .catch(error => {
          console.log(error);
        });

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章