Vue3和TypeScript下基于Axios的二次封装教程

这篇具有很好参考价值的文章主要介绍了Vue3和TypeScript下基于Axios的二次封装教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

准备

截屏2023-05-14 21.10.35.png

  • 创建vue3项目

  • 在 src 的文件下创建 发送网络请求相关的 文件夹 🗂️ service

🗂️ service 包含有:

  • index.ts 统一的出口

  • 📁 request 用于封装axios网络请求

  • 📁 modules 模块发送网络请求

  • 📁 config 配置项

  • 用于测试发送 网络请求的 api
    - 历史上的今天 https://api.oioweb.cn/api/common/history
    - 每日一句英文 https://api.oioweb.cn/doc/common/OneDayEnglish

  • 推荐使用 直课堂公开的api http://www.zkt-it.com:5050/jiekou/?target_id=001

    • baseURL: http://www.zkt-it.com:5050

📁 request

🏷️ index.ts

使用 class把封装 axios 封装成一个类,导出这个类

类型问题:

axios.create类型:
截屏2023-05-15 10.28.59.png
拦截器类型问题:
截屏2023-05-14 22.57.56.png

封装代码

import axios from 'axios'import type { AxiosInstance } from 'axios'// 拦截器:loading、token、修改配置// AxiosRequestConfig类型中没有 interceptors 需要扩展类型import PKRequestConfig from './type'class PKRequest {
  instance: AxiosInstance  constructor(config: PKRequestConfig) {
    // 每个实例都会 创建axios 
    this.instance = axios.create(config)

    //   实例 全局的拦截器
    this.instance.interceptors.request.use(
      (config) => {
        console.log('实例-> 全局的请求成功的拦截:')
        return config      },
      (err) => {
        console.log('实例-> 全局的请求失败的拦截:')
        return err      }
    )
    this.instance.interceptors.response.use(
      (res) => {
        console.log('实例-> 全局的响应成功的拦截:')
        //  res.data => promise的res类型有问题 : 通过泛型解决
        return res      },
      (err) => {
        console.log('实例-> 全局的响应失败的拦截:')
        return err      }
    )
    //   针对特定的pkRequest实例添加拦截
    this.instance.interceptors.request.use(
      config.interceptors?.requestSuccessFn,
      config.interceptors?.requestFailedFn    )
    this.instance.interceptors.response.use(
      config.interceptors?.reponseSuccessFn,
      config.interceptors?.reponseFailedFn    )
  }
  // 网络请求泛型; 因为promise的成功的回调 返回的类型 是创建实例时确定的
  // PKRequestConfig<T> : PKRequestConfig中的拦截器 响应成功的返回数据类型需要和 promise一致
  request<T = any>(config: PKRequestConfig<T>) {
    // 针对网络请求 中,有 拦截器
    if (config.interceptors?.requestSuccessFn) {
      // 单次请求的成功拦截
      config.interceptors.requestSuccessFn(config as any)
    }
    // 返回的promise
    return new Promise<T>((resolve, reject) => {
      this.instance        .request<any, T>(config)
        .then((res) => {
          if (config.interceptors?.reponseSuccessFn) {
            res = config.interceptors.reponseSuccessFn(res)
          }
          resolve(res)
        })
        .catch((err) => {
          reject(err)
        })
    })
  }


  get<T = any>(config: PKRequestConfig<T>) {
    return this.request({ ...config, method: 'GET' })
  }
  post<T = any>(config: PKRequestConfig<T>) {
    return this.request({ ...config, method: 'POST' })
  }
  delete<T = any>(config: PKRequestConfig<T>) {
    return this.request({ ...config, method: 'DELETE' })
  }
  put<T = any>(config: PKRequestConfig<T>) {
    return this.request({ ...config, method: 'PUT' })
  }
  patch<T = any>(config: PKRequestConfig<T>) {
    return this.request({ ...config, method: 'PATCH' })
  }}export default PKRequest


import type { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'// 扩展 AxiosRequestConfig类型interface PKInterceptors<T = AxiosResponse> {
  requestSuccessFn?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig
  requestFailedFn?: (err: any) => any
  reponseSuccessFn?: (res: T) => T
  reponseFailedFn?: (err: any) => any}interface PKRequestConfig<T = AxiosResponse> extends AxiosRequestConfig {
  interceptors?: PKInterceptors<T>}export default PKRequestConfig


📁 config

🏷️ index.ts 主要写配置

export const BASE_URL = 'http://www.zkt-it.com:5050'export const TIME_OUT = 10000// 测试登录获取tokenexport const BASE_URL2 = 'http://codercba.com:5000'


📁 index.ts

创建 PKRequest 的实例。实例可以有多个
例如:

import PKRequest from './request'import { BASE_URL, TIME_OUT } from './config/index'// pkRequest实例const pkRequest = new PKRequest({
  baseURL: BASE_URL,
  timeout: TIME_OUT})// 实例2export const pkRequest2 = new PKRequest({
  baseURL: 'https://api.oioweb.cn/api/common',
  timeout: 8000,
  // 单独的拦截器
  // AxiosRequestConfig类型中没有 interceptors
  interceptors: {
    requestSuccessFn: (config) => {
      console.log('pkRequest2单独拦截器:请求成功的拦截')
      return config    },
    requestFailedFn: (err) => {
      console.log('pkRequest2单独拦截器:请求失败的拦截')
      return err    },
    reponseSuccessFn: (res) => {
      console.log('pkRequest2单独拦截器:响应成功的拦截')
      return res    },
    reponseFailedFn: (err) => {
      console.log('pkRequest2单独拦截器:响应失败的拦截')
      return err    }
  }})// 实例3:登录 BASE_URL2export const pkRequest3 = new PKRequest({
  baseURL: BASE_URL2,
  timeout: 3000})export default pkRequest


📁 module

🏷️ index.ts

import('./home')import('./year')import('./gettest')import('./login')


🏷️ home.ts

import pkRequest from '..'// home.ts // 根据请求数据设置数据类型interface INews {
  data: any[]
  status: number
  statusText: string
  config: object
  headers: any
  request: any}pkRequest  .request<INews>({
    url: '/news'
  })
  .then((res) => {
    // 通过泛型设置,此时的res类型为 INews
    console.log('pkRequest1:新闻', res.data, res.status)
  })pkRequest  .request({ //没有特别写类型,则是泛型的默认值 any
    url: '/mingxing',
    interceptors: {
      requestSuccessFn: (config) => {
        console.log('/mingxing 请求成功的拦截 :')
        return config      },
      reponseSuccessFn: (res) => {
        console.log('/mingxing 响应成功的拦截 :')
        return res      }
    }
  })
  .then((res) => {
    console.log('pkRequest1:明星', res)
  })


🏷️ year.ts

import { pkRequest2 } from '..'// year.tspkRequest2  .request({
    url: '/history'
  })
  .then((res) => {
    console.log('pkRequest2:历史上的今天', res)
  })


🏷️ login.ts

import { pkRequest3 } from '..'const postLoginRequest = async () => {
  const res = await pkRequest3.post({
    url: '/login',
    data: {
      name: 'coderwhy',
      password: '123456'
    }
  })
  console.log('登录用户信息:')
  console.table(res.data.data)}postLoginRequest()


输出结果

截屏2023-05-15 10.49.59.png文章来源地址https://www.toymoban.com/news/detail-450045.html

到了这里,关于Vue3和TypeScript下基于Axios的二次封装教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3中搜索表单的二次封装

    最近使用Vue3+ElementPlus开发项目,从整体上构思组件的封装。能写成组件的内容都进行封装,方便多个地方使用。 受AntDesign的启发,在项目中有搜索表单+table+分页的地方可以封装为一个组件,只需要对组件传入table的列,组成一个配置项,通过配置可以显示搜索表单、table项的

    2024年02月11日
    浏览(45)
  • axios的二次封装

    1 axios是干什么的? XMLHttpRequest、jq、fetch、axios都是用来向服务器端发送请求,并获得响应 2 为什么要进行二次封装axios? 为了封装请求拦截器,响应拦截器 请求拦截器:可以在发送请求之前可以处理一些业务 响应拦截器:当服务器数据返回以后,可以处理一些事情 在src下创

    2023年04月12日
    浏览(92)
  • vue3富文本编辑器的二次封装开发-Tinymce

    欢迎点击领取 -《前端开发面试题进阶秘籍》:前端登顶之巅-最全面的前端知识点梳理总结 专享链接 简介 1、安装:pnpm add tinymce @tinymce/tinymce-vue === Vue3 + tinymce + @tinymce/tinymce-vue 2、功能实现图片上传、基金卡片插入、收益卡片插入、源代码复用、最大长度限制、自定义表情包

    2024年02月07日
    浏览(61)
  • 关于axios的二次封装

    @1 第一步 我们一般都会先导入axios         import axios from ‘axios’ @2 第二步 创建axios的实例 可以同时创建多个实例 每个实例配置不同         const http = axios.create( {                  // 这里面可以做一些基础的配置 比如基础路径 ,axios 请求超时的时间            

    2024年02月03日
    浏览(49)
  • Axios的二次封装(简单易懂)

    是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端 简单的理解就是ajax的封装 在使用Vue.js框架开发前端项目时 会经常发送ajax请求服务端接口 在开发过程中 需要对axios进一步封装 方便在项目中的使用 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求

    2023年04月09日
    浏览(102)
  • vue3 element-plus el-form的二次封装

    form表单的二次封装 vue3 element-plus el-form的二次封装 属性名 类型 默认值 说明 data Array [] 页面展示数据内容 onChange Function false 表单事件 bindProps Object {} 表单属性 formRef Object {} 表单ref ruleForm Object {} 数据

    2024年02月13日
    浏览(67)
  • 个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios

    在上文中,我们封装了统一的后端数据返回结果,有了标准化的接口数据,我们就可以针对它,在前端发送接收时,进行预处理。 通常在一个企业级或者个人开源的项目中, Axios 会被二次封装。 二次封装的好处有哪些呢? 统一 url 配置 统一 api 请求 request (请求)拦截器,例

    2024年02月06日
    浏览(62)
  • Vue组件封装:基于Vue3+wangeditor富文本组件二次封装

    1.简介         开源 Web 富文本编辑器,开箱即用,配置简单。一个产品的价值,就在于解决用户的问题,提高效率、降低成本、增加稳定性和扩展性。wangEditor 不是为了做而做,也不是单纯的模仿谁,而是经过上述问题分析之后,给出一个系统的解决方案。旨在真正去解决用

    2024年04月08日
    浏览(40)
  • axios 实战进阶练习( axios 封装篇)——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台的 axios 封装实战

    在之前的文章 axios 实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 中,我们完成了这个 基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 的项目,其中项目的后端接口是用 Node.js 编写的,通过 axios 来获取接口,所以这篇文章我们来对这个 axi

    2024年02月11日
    浏览(91)
  • 基于Vant组件库二次封装组件(TS+Vue3.x环境)

    1. 今天的需求是封装一个 Navigation Bar 导航栏组件,目的是给到App几乎所有的页面复用:      2. 因为之前的项目里使用过Vant组件库,笔者第一时间想到了Vant组件库中的 NavBar 组件,和当前App的需求匹配度很高。Vant组件库的 NavBar 组件: 3. 相信你也发现了,Vant组件库默认主题

    2023年04月18日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包