Vue + Element-UI —— 项目实战(四)

系列文章目录

Vue + Element-UI —— 项目实战(零)(项目概述)

Vue + Element-UI —— 项目实战(一)

Vue + Element-UI —— 项目实战(二)

Vue + Element-UI —— 项目实战(三)



四、项目实战四

Ⅰ、axios 的使用和二次封装

1. axios 的基本使用
  1. Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
  1. 特性:
    从浏览器中创建 XMLHttpRequests
    从 node.js 创建 http 请求
    支持 Promise API
    拦截请求和响应
    转换请求数据和响应数据
    取消请求
    自动转换 JSON 数据
    客户端支持防御 XSRF
  1. 安装 axios
	$ npm install axios
  1. main.js 文件中引入 axios
	import http from "axios";
  1. 使用 axios,因为 axios 不是一个插件,所以要全局使用,只能将它绑定在 Vue 的 prototype 属性上
	Vue.prototype.$http = http;
  1. axios 执行 get 请求案例
	// 为给定 ID 的 user 创建请求
	axios.get('/user?ID=12345')
	  .then(function (response) {
    
    
	    console.log(response);
	  })
	  .catch(function (error) {
    
    
	    console.log(error);
	  });
	// 上面的请求也可以这样做
	axios.get('/user', {
    
    
	    params: {
    
    
	      ID: 12345
	    }
	  })
	  .then(function (response) {
    
    
	    console.log(response);
	  })
	  .catch(function (error) {
    
    
	    console.log(error);
	  });
  1. axios 执行 post 请求
	axios.post('/user', {
    
    
	    firstName: 'Fred',
	    lastName: 'Flintstone'
	  })
	  .then(function (response) {
    
    
	    console.log(response);
	  })
	  .catch(function (error) {
    
    
	    console.log(error);
	  });
2. axios 的二次封装

为什么进行二次封装?

api 可以统一管理,不管接口有多少,所有的接口都可以非常清晰,容易维护。

  1. 创建 config 文件夹,并在该文件夹下创建 index.js 文件
	// 项目的配置文件
	// 配置baseUrl,之后就可以传相对路径
	export default {
    
    
	  baseUrl: {
    
    
	      dev: '/api/',  //开发环境
	      pro: '',       //生产环境
	  }
	};
  1. 创建 api 文件夹,在该文件夹下创建 axios.js 文件
	// 二次封装 将 axios 和 配置文件 进行结合 
	
	import axios from 'axios'
	// 引入对路径的基本配置,便可以使用相对路径
	import config from '../config/index'
	// 设置配置,因为开发环境(dev)、测试环境(test)和生产环境(prod)的baseUrl地址不一样 
	// process.env 包含着有关系统环境的信息
	// NODE_ENV:判断生成环境或开发环境还是测试环境的依据。
	const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
	class HttpRequst {
    
    
	  constructor(baseUrl) {
    
    
	    // 将baseUrl 添加到当前实例的baseUrl属性上
	    this.baseUrl = baseUrl
	  }
	
	  // 定义 axios相关的配置
	  getInsideConfig() {
    
    
	    const config = {
    
    
	      // 拿到当前实例下的 baseUrl
	      baseURL: this.baseUrl,
	      // 请求头的信息
	      header: {
    
    }
	    }
	    return config
	  }
	
	  // 拦截器:在请求或响应被then或catch处理前拦截它们
	  interceptors(instance) {
    
    
	    // 添加请求拦截器
	    instance.interceptors.request.use(function (config) {
    
    
	      // 在发送请求之前做些什么
	      console.log('拦截处理请求');
	      return config;
	    }, function (error) {
    
    
	      // 对请求错误做些什么
	      return Promise.reject(error);
	    });
	
	    // 添加响应拦截器
	    instance.interceptors.response.use(function (response) {
    
    
	      console.log('处理相应');
	      // 对响应数据做点什么
	      return response.data;
	    }, function (error) {
    
    
	      console.log(error);
	      // 对响应错误做点什么
	      return Promise.reject(error);
	    });
	  }
	
	  // 接口请求时调用
	  request (options) {
    
    
	    // 创建 axios实例
	    const instanse = axios.create()
	    // 对相关的配置信息getInsideConfig()进行解构, 对传入的相关参数options解构
	    options = {
    
     ...(this.getInsideConfig()), ...options }
	    // console.log(options);
	    this.interceptors(instanse)
	    // 返回接口请求的结果
	    return instanse(options)
	  }
	}
	
	// 暴露传入baseUrl的实例
	export default new HttpRequst(baseUrl)
  1. 在 api 文件夹中创建 data.js 文件,该文件写入接口请求
	// 写入接口请求的文件
	import axios from './axios'
	
	export const getMenu = (param) => {
    
    
	    return axios.request({
    
    
	        url: '/permission/getMenu',   //接口的相关地址
	        method: 'post',               //请求方式
	        data: param                   //传入的参数
	    })
	} 
  1. 在 ./home/index.vue 中导入 getMenu
	import {
    
     getMenu } from "../../api/data.js";
  1. 在 ./home/index.vue 的 mounted 函数中使用,之后刷新控制台,会发现发出了请求,但有 404 错误(因为并没有获取到后台数据)
	getMenu.then((res) => {
    
    
		console.log(res)
	})

Ⅱ、mock 数据模拟

mock官网链接

1. mock 简单介绍

mock 可以干什么 ?
————————————————
答:生成随机数据,拦截 Ajax 请求

在这里插入图片描述

2. mock 的基本使用
  1. 基本语法解释:
    (1)rurl:url 的规则(指定的url或者正则)
    (2)rtype:接口请求的类型(get、post)
    (3)template | function(options) 返回的数据 用模板或者回调函数
	Mock.mock(rurl?, rtype?, template|function(options))
  1. 安装 mockjs
	npm i mockjs
  1. 在 api 文件夹下创建 mockServerData 文件夹,在该文件夹下创建 home.js 文件,进行对 home 主页(列表、折线图、柱状图和饼状图)相关数据的模拟
	import Mock from 'mockjs'
	
	export default {
    
    
	  getStatisticalData: () => {
    
    
	    //Mock.Random.float 产生随机数100到8000之间 保留小数 最小0位 最大0位
	    //用于折线图的随机数据模拟(现在还用不到)
	    for (let i = 0; i < 8; i++) {
    
    
	      List.push(
	        Mock.mock({
    
    
	          苹果: Mock.Random.float(100, 8000, 0, 0),
	          vivo: Mock.Random.float(100, 8000, 0, 0),
	          oppo: Mock.Random.float(100, 8000, 0, 0),
	          魅族: Mock.Random.float(100, 8000, 0, 0),
	          三星: Mock.Random.float(100, 8000, 0, 0),
	          小米: Mock.Random.float(100, 8000, 0, 0)
	        })
	      )
	    }
	    return {
    
    
			code: 20000, //状态码(20000表示正常的数据)
			data: {
    
    
		      tableData: [
		        {
    
    
		          name: 'oppo',
		          todayBuy: 500,
		          monthBuy: 3500,
		          totalBuy: 22000
		        },
		        {
    
    
		          name: 'vivo',
		          todayBuy: 300,
		          monthBuy: 2200,
		          totalBuy: 24000
		        },
		        {
    
    
		          name: '苹果',
		          todayBuy: 800,
		          monthBuy: 4500,
		          totalBuy: 65000
		        },
		        {
    
    
		          name: '小米',
		          todayBuy: 1200,
		          monthBuy: 6500,
		          totalBuy: 45000
		        },
		        {
    
    
		          name: '三星',
		          todayBuy: 300,
		          monthBuy: 2000,
		          totalBuy: 34000
		        },
		        {
    
    
		          name: '魅族',
		          todayBuy: 350,
		          monthBuy: 3000,
		          totalBuy: 22000
		        }
		      ]
		   }
		}
	  }
	}
  1. 在 api 文件夹下 创建 mock.js 文件,用于对使用到 mock 的文件进行导入和使用
	import Mock from 'mockjs'
	import homeApi from './mockServerData/home'
	
	Mock.mock('/api/home/getData', homeApi.getStatisticalData)
  1. 在 main.js 中进行 mock 的引入
	import "../api/mock.js";
  1. 把 ./home/index.vue 中 的 getMenu 换成 getMenu
	import {
    
     getMenu } from "../../api/data.js";
  1. 在 data.js 文件中定义 getData
	// 写入接口请求的文件
	import axios from './axios'
	
	export const getData = () => {
    
    
	    return axios.request ({
    
    
	        url: '/home/getData', //接口的相关地址
	        method: 'get'         //请求方式
	    })
	}
  1. 在 ./home/index.vue 中,把 tableData中的数据置空,因为把这部分数据已经转移到了 home.js 中的 tableData 中存储
	data() {
    
    
	  return {
    
    
		tableData: []
	  } 
	},
	mounted() {
    
    
	  // 将res下的code和data解构 data是数组List中的数据
      const {
    
     code, data } = res;
      // 正常接口返回的时候
      if (code === 20000) {
    
    
      	//获取home.js中定义好的tableData数据
        this.tableData = data.tableData;
      }
	}

在这里插入图片描述

不积跬步无以至千里 不积小流无以成江海

点个关注不迷路(持续更新中…)

猜你喜欢

转载自blog.csdn.net/qq_45902692/article/details/125172438
今日推荐