Skip to content

Vue2开发模板

技术选型

Vue2 + elementUI + axios

vue3+vite封装axios和全局loading

api.js 封装的是api接口,在项目中大量用到接口不能分散写在各处、不易维护 baseUrl.s 匹配环境变量 比如开发环境则使用线上接口,生产环境则使用生产接口 http.js 创建axiso实例写入请求拦截响应拦截 request.js 封装的是请求方法,在项目中大量用到接口,所以将请求方法也封装

baseUrl.js

jsx
let baseURL = "";
if (process.env.NODE_ENV === "development") {
    // 开发环境  因为我这里写了配置跨域的重定路径所以是api 如下图    
    baseURL = "/api";
} else if (process.env.NODE_ENV === "production") {
    // 正式环境 真正的上线网址 不是跨域别名路径,在network不显示    
    baseURL = "";
} else {
    // 测试环境    
    baseURL = "";
}
export default baseURL;

vite.config.js中配置代理

jsx
server: {
    host: '0.0.0.0',    hmr: true,    strictPort: false,    proxy: {
      '/api': {
        target: 'http://localhost:3000',        
        changeOrigin: true,        
        ws: false,        
        rewrite: (path) => path.replace(/^\/api/, "")
      }
    }
  }

http.js创建axiso实例

jsx
import axios from "axios";
// 导入element-ElMessage 弹框
import { ElMessage } from "element-plus";
// 导入配置的环境变量url
import baseURL from "./baseURL";
// 导入路由,没有this,使用路由实例跳转
import router from "../route/router.ts";
// 导入main全局配置文件
import app from "../../src/main";
// 开启loading
app.config.globalProperties.$loading.showLoading();
// 创建axios实例
const http = axios.create({
  baseURL, //配置了跨域,起了别名api,在baseBUL用了别名,这里使用baseURL,配置在下面vue.config.js  
  timeout: 6000,  
  withDirectives: true, // 是否携带cookies
});
// 请求拦截
http.interceptors.request.use((config) => {
    // 在请求发送之前做一些处理 config是axios的配置对象    
    // console.log(config);    
    //  携带token    
    config.headers["Authorization"] = "Bearer " + JSON.parse(localStorage.getItem("remember_token")) || null;    // 配置完成将config返回    
    return config;  
}, (err) => {
    // 当请求失败时做一些处理 抛出错误    
    throw new Error(err);  
});
// 响应拦截
http.interceptors.response.use((res) => {
    // 在返回响应之前做一些处理 res是axios的配置对象    
    // console.log(res);    
    // 关闭loading    
    app.config.globalProperties.$loading.hideLoading();    
    // 根据后台状态码统一封装提示信息 就不需要在页面接口在单独写了    
    // 这里根据实际接口的嵌套情况和状态码来写 这里只是我的接口嵌套情况    
    let { status, msg } = res.data.meta;    
    //key = value  status等于200就执行200下的代码 执行完break退出循环    
    switch (status) {
      case 200:        
	      ElMessage({
	          showClose: true,          
	          message: msg,          
	          type: "success",        
	      });        
	      break;      
	  case 401:        
		  ElMessage({
	          showClose: true,          
	          message: "未授权",          
	          type: "error",        
	      });        
	      // console.log(this);        
	      // this是undefined所以引入路由;        
	      router.push("/login"); 
	      //未授权跳转到login        
	      break;    
	}
    // 这里根据接口返回的数据嵌套结构来返回 比如我的接口返回的是{data:{message:{}}}    
    return res.data.message;  
},(err) => {
    // 当响应失败时做一些处理 抛出错误    
    throw new Error(err);  
  }
);
// 导出 http实例 方便调用
export default http;

另一种方案

原文参考:前端架构带你 封装axios,一次封装终身受益「美团后端连连点赞」 - 掘金

vue3按需引入echarts

在src目录下新建/plugins/echarts.js

js
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from "echarts/core";
/** 引入柱状图and折线图图表,图表后缀都为 Chart  */
import { BarChart, LineChart } from "echarts/charts";// 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,  TooltipComponent,  GridComponent,  DatasetComponent,  TransformComponent,} from "echarts/components";
  // 标签自动布局,全局过渡动画等特性
import { LabelLayout, UniversalTransition } from "echarts/features";
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from "echarts/renderers";
// 注册必须的组件
echarts.use([
  TitleComponent,  TooltipComponent,  GridComponent,  DatasetComponent,  TransformComponent,  BarChart,  LabelLayout,  UniversalTransition,  CanvasRenderer,  LineChart,]);
  // 导出
  export default echarts;

main.js中引入

js
// 引入echartsimport echarts from "./plugins/echarts";
// 挂载到vue实例中
app.config.globalProperties.$echarts = echarts

使用

html
<div class="echarts_container" ref="leftOne"></div>
jsx
import { ref, onMounted, getCurrentInstance } from "vue";
const leftOne = ref(null) 
//echart容器
const { appContext } = getCurrentInstance()
//组件挂载后执行
onMounted(() => {
  initLeftChartOne()
})
const initLeftChartOne = () => {
const leftChartOne = appContext.config.globalProperties.$echarts.init(leftOne.value);  
const option = {
    xAxis: {
      data: ["A", "B", "C", "D", "E"],    
    },    
    yAxis: {},    
    series: [
    {
        data: [10, 22, 28, 43, 49],        
        type: "line",        
        stack: "x",      
	},      
	{
        data: [5, 4, 3, 5, 10],        
        type: "line",        
        stack: "x",      
    }]  
};  
leftChartOne.setOption(option);  
window.addEventListener("resize",function() {
    leftChartOne.resize()
  })
};