前言

​前期回顾    

vite + vue3 + ts配置《企业级项目》二次封装el-table、分页_0.活在风浪里的博客-CSDN博客封装的功能有哪些?分页、表格排序、文字居中、溢出隐藏、操作列、开关、宽、最小宽、type类型(selection/index/expand)、格式化 、不同页面不同操作列、vuex、vue持久化插件、(此处没有接口所以用到,还涉及了query与params传值区别)子组件说思路:data数据请求接口拿到,表头数据一般也是后台接口,如没,前台可自定义自己写......https://blog.csdn.net/m0_57904695/article/details/125613767?spm=1001.2014.3001.5501


目录

前言

我要实现什么效果?

代码简单吗?

念及此

一、封装axiso前先配置环境变量

第一步: 配置环境变量

第二步:封装axios

二:封装loading

​ loading.vue

index.ts

在main.ts引入index.ts

三:封装返回顶部

MyBackTop.vue

index.ts

在main.ts引入index.ts

结语


我要实现什么效果?

  • 全局封装一次!

  • 项目中切换路由显示loading,

  • 发起axios显示loading,

  • 每个页面显示返回顶部

代码简单吗?

  • 极简

念及此

  • 正文开始

一、封装axiso前先配置环境变量

  • 因为真实项目中需要不同环境测试的

第一步: 配置环境变量

在根目录新建三个文件

.env.development

 NODE_ENV='development'

.env.production

  NODE_ENV='production'

.env.staging

NODE_ENV='production'

完成!

第二步:封装axios

在src下新建newwork文件夹 并在里面新建4个文件

解释:

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

正文:

一:先写baseUrl.js 匹配环境变量

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;

二: 网址配好后写 http.js 创建axiso实例

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.jstimeout: 6000,withDirectives: true, // 是否携带cookies
});
// 请求拦截
http.interceptors.request.use((config) => {// 在请求发送之前做一些处理 config是axios的配置对象// console.log(config);//  携带tokenconfig.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);// 关闭loadingapp.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"); //未授权跳转到loginbreak;}// 这里根据接口返回的数据嵌套结构来返回 比如我的接口返回的是{data:{message:{}}}return res.data.message;},(err) => {// 当响应失败时做一些处理 抛出错误throw new Error(err);}
);
// 导出 http实例 方便调用
export default http;

三:请求封装好了 封装请求方法 request.js

import http from "./http";
// post请求: 传参数没有明确规定使用params接受参数就是要使用data请求体接受,get请求要使用params接受
// put 也相当与post请求,如果报参数错误,就是接受参数的请求体错了post/put用data,get请求用params
function request({ method = 'get', url, data = {}, params = {} }) {return http({method,url,data,params})
}export default request;

四:请求方法好了 封装api.js

// 导入请求的方法// 不使用箭头函数
// export function home() {
//     return request({ url: '/home', })
// }import request from "./request";
// 用户登陆的接口  post请求使用data请求体 默认封装的get 如果是get请求不需要写methiodexport const login = (data) => request({ method: "post", url: '/login', data: data });// 获取用户列表的接口 ,需要有默认参数. pagenum: 1,pagesize: 10,,所以要接收,export const getUserList = (params) => request({ url: '/users', params });// put请求修改用户id users/:uId/state/:typeexport const getEdit = (data) => request({method: "put",data,url: "users/" + data.uid + "/state/" + data.type,})export const order = () => request({ url: "/home/floordata" });

二:封装loading

在src下的 components 新建 俩个文件

loading.vue

<template><div id="loading" v-show="visible"><div class="circle"></div><br />疯狂加载中...</div>
</template><script>
import { defineComponent, ref } from "vue";
export default defineComponent({name: "Loading",setup() {// 控制组件的状态let visible = ref(false);// 显示组件let showLoading = () => {visible.value = true;};// 隐藏组件let hideLoading = () => {visible.value = false;};return { visible, showLoading, hideLoading };},
});
</script>
<style scoped>
#loading {width: 100%;height: 100%;display: flex;flex-direction: column;position: absolute;top: 0;left: 0;z-index: 999;display: flex;align-items: center;justify-content: center;
}
@keyframes loading {0% {transform: rotate(0);}50% {transform: rotate(160deg);}100% {transform: rotate(360deg);}
}
.circle {width: 45px;height: 45px;background-color: transparent;border-radius: 50%;border: 5px solid #528bee;border-left-color: #ccc;animation: loading 1s linear 1s infinite;
}
</style>

index.ts

  • (因为我是ts项目所以.ts)
import { createApp } from "vue";
// 导入写好的Loading.vue文件
import Loading from "./Loading.vue";
export default {loading: null,/*    每当这个插件被添加到应用程序中时,如果它是一个对象,就会调用 install 方法。如果它是一个 function,则函数本身将被调用。在这两种情况下——它都会收到两个参数:由 Vue 的 createApp 生成的 app 对象和用户传入的选项。 */install(app) {if (this.loading) {// 防止多次载入app.config.globalProperties.$loading = this.loading;return;}// 创建Loading实例,用于挂载let instance = createApp(Loading);// 创建div元素装载Loading对象let div = document.createElement("div");let body = document.body;// 导入body中body.appendChild(div);this.loading = instance.mount(div);// 挂载vue身上app.config.globalProperties.$loading = this.loading;},
};

在main.ts引入index.ts

// 自定义loading组件
import Loading from "./components/MyLoading/index.ts";app.use(Loading);export default app; // 这里导出app的目的,是为了在后面演示js文件中使用插件

封装完成,现在 在请求拦截前和路由跳转前 开启一下全局生效 

http.js

router.ts

router.beforeEach((to, from, next) => {if (to.meta.loading) {app.config.globalProperties.$loading.showLoading();next();} else {next();}
});
router.afterEach((to, from) => {if (to.meta.loading) {app.config.globalProperties.$loading.hideLoading();}
});

封装请求loading完成


三:封装返回顶部

在src 的components 下新建 俩个文件

MyBackTop.vue

<template><el-backtopstyle="width: 60px; height: 60px":bottom="50":visibility-height="1000"/>
</template>

index.ts

import { createApp } from "vue";
import BackTop from "./MyBackTop.vue";
export default {BackTop: null,install(app) {if (this.BackTop) {app.config.globalProperties.$BackTop = this.BackTop;return;}let instance = createApp(BackTop);let div = document.createElement("div");let body = document.body;body.appendChild(div);this.BackTop = instance.mount(div);app.config.globalProperties.$BackTop = this.BackTop;},
};

在main.ts引入index.ts

// 自定义回到顶部组件
import BackTop from "./components/MyBackTop/index.ts"app.use(BackTop);export default app; // 这里导出app的目的,是为了在后面演示js文件中使用插件

结语

目前为止我们实现了 axios封装 loading 封装 返回顶部封装 !本人亲测保证能用

最后祝大家2022越来越强 

vite + vue3 + 封装axios + 封装loading + 封装返回顶部相关推荐

  1. vue3(vite)设置代理,封装axios,api解耦

    一.设置代理 打开根目录下的vite.config.js文件,设置代理 import { defineConfig } from 'vite' import vue from '@vitejs/plu ...

  2. vue3+vite+ts 封装axios踩坑记录

    注意注意注意!!踩坑记录非教程示例,别跟着我进坑里,太胖我可能捞不起来(ÒωÓױ). 安装axios:npm install axios src文件夹下创建api和utils文件夹,utils里创建r ...

  3. Vue-vben-admin Vue3+TS Axios的封装源码分析

    Vue-vben-admin Vue3+TS Axios的封装源码分析 前言 一.近期再用Vue3+TS 重构之前Vue2的项目,因此想着借鉴一下业界较为优秀的代码,在Git上面找了好久,经过同事推荐 ...

  4. 使用TS+vue3封装axios时编译报错,提示You may need an additional loader to handle the result of these loaders.

    基于vue3+TS构建的商城后台管理系统 根据coderwhy老师指导搭建的项目为PC端商品后台管理系统. 报错: 使用TS+vue3封装axios时编译报错,提示You may need an ad ...

  5. Vue3+TypeScript 项目封装axios

    Vue3+TypeScript 项目封装axios VUE CLI 中代码目录解构 config.js let BASE_URL = '' const TIME_OUT = 10000 //区分环境不 ...

  6. 同时多个axios请求_用 React+Antd 封装 Axios 实现全局 Loading 效果

    前言 今天在做 react 后台管理的时候要实现一个全局 Loading 效果,通常使用 axios 库与后端进行数据交互.为了更好的用户体验,在每次请求前添加一个加载效果,让用户知道在等待加载. 要 ...

  7. 封装axios加载动画Loding——vuex+axios拦截器

    封装axios加载动画Loding--vuex+axios拦截器 前言:我们在axios发送请求时候,会存在请求等待时长,我们一般会加一个动画,如果很多个时候一个一个的加动画代码看起来很臃肿很冗余,我 ...

  8. axios队列 vue_(十三 )Vue 封装axios(四种请求)及相关介绍

    Vue 封装axios(四种请求)及相关介绍 首先axios是基于promise的http库 promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执行,返回符合预期的 ...

  9. axios基础和封装

    一.简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http ...

最新文章

  1. 聚类常见距离及python实现
  2. 你总是不要等到完全准备好了再去做事情
  3. 动态内存管理:malloc和free以及new和delete的联系与区别
  4. vue --- vue-router
  5. 解决黑苹果的887驱动问题
  6. 从病毒到“基础软件污染”,Linux 真的安全吗?
  7. Okhttp之RouteSelector简单解析
  8. neo4j---学习笔记
  9. 电脑 Google浏览器 截长屏 无任何辅助软件
  10. “立字据,你们这群混蛋!”
  11. Altium设置菜单之PCB编辑菜单
  12. Java_最不重要位替换(LSB)基于24位BMP图片
  13. Vue中使用tailwindcss
  14. js 实现呼起(打开)app
  15. PHP水仙花数程序设计思路,php实现水仙花数示例分享
  16. http 1.php,php利用socket扩展写一个简单的单进程http服务1
  17. Linux 串口测试 操作说明
  18. 常用电子元件基础知识(图解)
  19. PID及串级PID的理解
  20. cassandra4.0.6试用

热门文章

  1. js replace 匹配正则 input只能输入正数 正则匹配负数
  2. jsPdf+html2Canvas+react实现前端页面导出pdf,并解决jspdf分页图片过长截断问题
  3. JQuery给标签添加属性attr
  4. 函数指针调用类的成员函数
  5. 你会为 AI 转型么?我在考虑。。。
  6. 无刷新跳转—关于history中pushState和replaceState方法详解
  7. ASEMI代理AD8638ARJZ-REEL7原装ADI车规级AD8638ARJZ-REEL7
  8. Java类的初始化顺序
  9. toString如何转json
  10. 程序员发朋友圈的七种范式