TypeScript-axios模块进行封装的操作与一些想法
所谓封装与模块化,对我这种初学者来说,个人理解就是解耦,比如说,当我们前端一个项目使用了现在流行的模块,但是没有对其进行封装处理,包括一些相同的代码逻辑,把他们分散在各个组件当中,这样一来整个项目对于这个模块的耦合度太高.如果将来这个模块突然停止维护,或者有更好的模块将其替代,我们想要更换模块时就显得异常困难.
通过对axios封装的学习.我想把它记录在博客中,也算是学习过后加深理解
虽然代码只针对于axios,但是其中的思想却是最重要的,看得懂代码只是第一步,了解其背后的意图才是主要目的.
我的项目是基于vue3和TypeScript的,因此逻辑部分将使用ts实现.当然,这只是为了演示而进行的简单的封装
--------------------------下面是具体的操作步骤-------------------------------
---------------------第一步,编写核心的代码逻辑-------------------------------
首先我们在项目中新建一个request.ts的文件,用来导入axios,编写核心的逻辑(请求方法,返回内容的操作等)
import type { AxiosInstance, AxiosRequestConfig } from 'axios'
import axios from 'axios'
class KXRequest {
instance: AxiosInstance
constructor(config: AxiosRequestConfig) {
this.instance = axios.create(config)
}
kxRequest(config: AxiosRequestConfig): void {
this.instance.request(config).then((res) => {
console.log(res)
})
}
}
export default KXRequest
使用class来使整个代码的封装性更强,
查看源码,发现axios.create(config)中的create方法需要传入一个类型为AxiosRequestConfig的参数,所以config的类型为AxiosRequestConfig
axios.create(config)执行后创建出来一个实例,这个实例的类型是AxiosInstance,为方便对返回值进行操作,新建一个instance变量,来储存axios.create(config)返回的结果,
所以instance的类型时AxiosStance类型的,
使用构造器的目的也是为了新建对象时对其中的instance进行初始化,并且要求使用这个类新建对象时传入的是AxiosRequestConfig类型的参数
然后使用instance进行下面的request操作
下面来分析request这个方法
kxRequest(config: AxiosRequestConfig): void {
this.instance.request(config).then((res) => {
console.log(res)
})
}
这里的request是我们自定义了一个名为request的方法,(嗯,区分一下instance的request),这里就先考虑他没有返回值
instance因为是AxiosStance类型,该类型有request方法,该方法会返回一个promise对象(这都是源码中的内容,使用WebStorm可以按住CTRL键查看)
下面贴一段源码
request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
而instan的request方法又需要传入一个AxiosRequestConfig的config作为参数,所以我们在编写kxRequest方法时需要将config也传进来,然后进行相对应的操作即可,
第一步讲解完成,当然,再次申明,这只是简单的实现,重要的是思想
---------------------第二步,为封装的方法设立一个统一的出口-------------------------------
import KXRequest from './request'
import { BASE_URL, TIME_OUT } from './request/config' const kxRequest = new KXRequest({
baseURL: BASE_URL,
timeout: TIME_OUT,
headers: [],
}) export default kxRequest
这里new的KXRequest中的参数就是其实就是config,这段代码相当于是对第一段代码的代理,进行初始化操作
---------------------最后一步,在项目中使用-------------------------------
先来代码,
import { createApp } from 'vue'
import App from './App.vue'
import kxRequest from './service/index'
const app = createApp(App)
app.mount('#app')
kxRequest.kxRequest({
url: '/home/multidata',
method: 'GET',
})
我删除了不相关的代码.
首先导入将第二步导出的kxRequest在main.ts中导入
接着调用kxRequest的request方法即可.此时调用的kxRequest方法实际是第一步中的kxRequest,因为导入的第二步的代码实际是创建了第一步的实例
这样便完成了一个简单的封装,当然我会在未来的时间继续在下方更新更多操作
TypeScript-axios模块进行封装的操作与一些想法的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...
- 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- TypeScript Modules(模块)
本文概述了TypeScript中如何使用模块以各种方式来组织代码.我们将涵括内部和外部的模块,并且讨论他们在适合在何时使用和怎么使用.我们也会学习一些如何使用外部模块的高级技巧,并且解决一些当我们使用 ...
- angularJS之使用指令封装DOM操作
angularJS之使用指令封装DOM操作 创建指令 指令也是一种服务,只是这种服务的定义有几个特殊要求: 必须使用模块的directive()方法注册服务 必须以对象工厂/factory()方法定义 ...
- selenium之封装登陆操作
# selenium 封装登录操作举例 import os, time # from selenium import webdriver class LoginPage(): '''登录模块''' d ...
- Nodejs之mssql模块的封装
在nodejs中,mssql模块支持sqlserver数据库操作.今天将mssql模块的某些功能封装为一个类,方便以后调用.封装的功能有执行存储过程,执行查询语句操作等.如果本篇文章对大家有帮助,那就 ...
- 模块的封装之C语言类的封装
[微知识]模块的封装(一):C语言类的封装 是的,你没有看错,我们要讨论的是C语言而不是C++语言中类的封装.在展开知识点之前,我首先要 重申两点: 1.面向对象是一种思想,基本与所用的语言是无关的. ...
- 原生 Ajax 封装 和 Axios 二次 封装
AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
随机推荐
- HTML 代码复用
前言 通常我们所做的一些页面,我们可以从设计图里面看出有一些地方是相同的.例如:头部,底部,侧边栏等等.如果是制作静态页面的同学,对于这些重复的部分只能够通过复制粘贴到新的页面来,如果页面的数量上去了 ...
- ORM要用到的数组转对象和对象转数组函数
<?php function array2object($array) { if (is_array($array)) { $obj = new StdClass(); foreach ($ar ...
- java+selenium脚本编写规范
2. 源文件规范 2.1 文件名 源文件以最顶层的类名来命名,大小写敏感,文件扩展名为.java 2.2 文件编码 UTF-8 源文件要求编码格式为UTF-8 2.3 源文件结 ...
- k8s笔记--驱逐与重调度,以及deschueduler的一次实验
在Kubernetes中,调度是指将Pod放置到合适的Node上,然后对应的Node上的Kubelet才能够运行这些pod.调度器通过Kubernetes的监测机制来发现集群中新创建且尚未被调度的No ...
- ☆☆如何学习MATLAB☆☆
大多数朋友第一次接触MATLAB一般都是在大学里面开设的MATLAB课程,第一次真正使用MATLAB是在自己的毕业论文中用到.所以对于MATLAB可以说是既爱又恨.爱,是因为使用MATLAB几乎可以实 ...
- OpenHarmony移植案例与原理:startup子系统之syspara_lite系统属性部件
摘要:本文介绍下移植开发板时如何适配系统属性部件syspara_lite,并介绍下相关的运行机制原理. 本文分享自华为云社区<openharmony移植案例与原理 - startup子系统之sy ...
- 『德不孤』Pytest框架 — 7、Pytest预期失败
目录 1.@pytest.mark.xfail()标记的作用 2.应用场景 3.语法参数说明 4.示例 5.忽略xfail标识 Pytest预期失败需要使用@pytest.mark.xfail()标记 ...
- 【转】VMWare中的Host-only、NAT、Bridge
背景:A是本机,A1,A2是虚拟机,B是外部联网的机器 host-only(主机模式): A可以和A1,A2互通,A1,A2 -> B不可以,B -> A1,A2不行 bridge(桥接模 ...
- 解决overlay2存储驱动的磁盘配额问题
为啥要用overlay2 docker centos(内核3.10)上默认存储驱动是devicemapper 的loop-lvm模式,这种模式是用文件模拟块设备,不推荐生产使用direct lvm又不 ...
- CVE-2022-22947 Spring Cloud Gateway SPEL RCE复现
目录 0 环境搭建 1 漏洞触发点 2 构建poc 3 总结 参考 0 环境搭建 影响范围: Spring Cloud Gateway 3.1.x < 3.1.1 Spring Cloud Ga ...