vue3和ts封装axios以及使用mock.js详解

yizhihongxing

Vue3和TypeScript封装Axios以及使用Mock.js详解

Vue3是目前前端开发中的一个热门框架,它提供了丰富的工具和API,使得我们可以更加高效地开发前端页面。与此同时,为了提升代码的可维护性和可读性,我们通常会使用TypeScript进行编写,其中Axios是常用的发起HTTP请求的第三方库,而Mock.js则是用于生成模拟数据的工具。

在本文中,我们将讲解如何在Vue3中使用TypeScript对Axios进行封装,并且结合Mock.js实现开发中数据请求与模拟数据的应用。

为什么要封装Axios

使用Axios时,我们会发现每次使用的方式大概是相同的。如下图所示,我们用Axios向后台请求获取数据。

import axios from 'axios';

axios.get('/api/data').then((response) => {
  console.log(response.data);
}).catch((err) => {
  console.log(err);
});

在实际开发中,我们往往需要对Axios进行一定程度的封装,例如:

  1. 统一处理接口地址前缀
  2. 统一处理错误请求响应
  3. 支持统一的Token验证
  4. 未登录自动跳转登录页等

以上这些需求,都可以通过对Axios进行封装来轻松实现。而使用TypeScript则可以增加代码的可维护性和可读性,使得我们开发过程中的问题更容易被发现和解决。

TypeScript基本语法

在编写本文之前我们假设读者对TypeScript比较熟悉,如果您对TypeScript缺乏基础,那么您可以先去学习一下TypeScript的基本语法。在这里,我们只简单提及类型和接口。

类型

在TypeScript中,我们可以定义类型,例如:

const num: number = 100;
const str: string = "hello world";
const bool: boolean = false;

如果在定义时没有指定类型,TypeScript可以通过变量的值自动推断类型:

const num = 100; // 类型为number
const str = "hello world"; // 类型为string
const bool = false; // 类型为boolean

接口

TypeScript的接口类似于Java中的接口,用于定义类或对象应该具有的属性。例如:

interface Person {
  name: string;
  age: number;
}

const person: Person = {
  name: "Tom",
  age: 18
};

上述代码定义了一个Person接口,它包含两个属性name和age。同时我们也定义了一个person对象,它具有Person接口的属性。

Axios封装

在Vue3中使用TypeScript对Axios进行封装时,我们可以先创建一个config.ts文件,用于存放Axios相关配置项。

import axios from 'axios';

axios.defaults.baseURL = 'http://localhost:3000'
axios.defaults.timeout = 5000;
axios.defaults.headers.post['Content-Type'] = 'application/json';

export default axios;

在上述代码中,我们创建了一个名为config.ts的文件,并导出了一个默认的axios对象。在这个文件中,我们对Axios进行了一定的配置:

  1. 统一设置接口地址前缀
  2. 统一设置请求超时时间
  3. 统一设置请求头

在导出了一个默认的axios对象之后,我们可以在其他组件中直接使用这个对象发送请求。例如:

import axios from '@/utils/config';

axios.post('/api/login', { username: 'admin', password: '123456' }).then((response) => {
  console.log(response);
}).catch((err) => {
  console.log(err);
})

Axios的请求拦截和响应拦截

为了更好地统一处理请求或响应,我们可以对Axios的请求和响应进行拦截。例如:

import axios from '@/utils/config';

// 请求拦截
axios.interceptors.request.use(
  (config) => {
    // 在每个请求中添加Token验证
    config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截
axios.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    // 统一处理错误响应
    if (error.response.status === 401) {
      localStorage.removeItem('token');
      router.replace({ path: '/login' }).then(() => {
        location.reload();
      });
    }
    return Promise.reject(error);
  }
);

我们首先使用axios.interceptors.request.use方法来对每个请求添加Token验证。在接下来的axios.interceptors.response.use中,我们处理了错误响应,并在未登录的情况下自动跳转到登录页。

使用Mock.js

Mock.js是一个生成随机数据的工具,它可以帮助我们在开发时使用模拟数据而无需等待后端提供接口。在使用Mock.js时,我们需要先在Vue3项目中安装该依赖。

npm install mockjs --save-dev

安装完成后,我们可以定义一个mock.ts文件,用于存放模拟数据。

import Mock from 'mockjs';

Mock.mock('/api/data', 'get', () => {
  return {
    code: 0,
    message: 'ok',
    data: {
      id: '01',
      name: 'hello world'
    }
  };
});

在上述代码中,我们定义了一个mock('/api/data', 'get', () => {})的接口,它表示当请求/api/data接口时,响应的方式为GET请求,并返回一个带有id、name属性的对象。

在完成了mock.ts文件的编写之后,我们需要在main.ts文件中引入该文件,以便Mock.js能够生效。例如:

import { createApp } from 'vue';
import App from './App.vue';
import './index.css';

import './utils/mock';

createApp(App).mount('#app');

在上述代码中,我们引入了mock.ts文件,并在创建Vue实例前通过createApp方法建立了应用。

至此,我们已经完成了Vue3和TypeScript封装Axios以及使用Mock.js的应用,可以在开发时获得更好的开发体验,同时也能避免因等待后端接口而导致的开发时间增长。

示例应用1

下面是一个示例应用,用于向后台/post请求数据和处理响应结果。

首先,我们创建一个名为example.ts的文件,用于定义请求和响应。

interface ExampleRequest {
  name: string;
  age: number;
}

interface ExampleResponse {
  code: number;
  message: string;
  data: {
    id: string;
    name: string;
    age: number;
  };
}

在这个文件中,我们定义了两个接口,分别用于请求和响应。在接下来的代码中,我们将使用这两个接口来定义请求和响应的数据。

在/src/utils目录下,我们创建一个名为api.ts的文件,在其中定义以下内容:

import axios from './config';

import { ExampleRequest, ExampleResponse } from '@/types/example';

export function postExample(params: ExampleRequest): Promise<ExampleResponse> {
  return axios.post<ExampleResponse>(`/api/example`, params);
}

在上述代码中,我们调用了config.ts文件导出的axios对象,并使用ExampleRequest和ExampleResponse来定义请求和响应的数据格式。其中,postExample方法的params参数为ExampleRequest,传递时按实际情况编写。

在Vue3组件中使用postExample方法:

import { defineComponent, ref } from 'vue';
import { postExample } from '@/utils/api';
import { ExampleRequest } from '@/types/example';

export default defineComponent({
  setup() {
    const request: ExampleRequest = {
      name: '',
      age: 0
    };
    const response = ref<null | ExampleResponse>(null);

    function submit() {
      postExample(request).then((res) => {
        console.log(res);
        response.value = res;
      }).catch((err) => {
        console.log(err);
      })
    }

    return {
      request,
      response,
      submit
    }
  }
})

在上述代码中,我们使用defineComponent方法定义了一个Vue3组件,在该组件中定义了一个request对象和一个response对象,用于存储请求和响应的数据。同时,我们定义了一个submit方法,用于发送请求,并在成功返回响应时进行一些操作,例如将响应结果打印到控制台或将响应结果存储到response对象中。

示例应用2

下面是另一个示例应用,用于通过异步await发送Get请求并处理响应结果。

首先,我们创建一个名为example.ts的文件,用于定义请求和响应。

interface ExampleResponse {
  code: number;
  message: string;
  data: {
    id: string;
    name: string;
    age: number;
  };
}

在这个文件中,我们定义了一个接口ExampleResponse,用于规定响应的数据格式。

在/src/utils目录下,我们创建一个名为api.ts的文件,在其中定义以下内容:

import axios from './config';

import { ExampleResponse } from '@/types/example';

export function getExample(): Promise<ExampleResponse> {
  return axios.get<ExampleResponse>(`/api/example`);
}

在上述代码中,我们调用了config.ts文件导出的axios对象,并使用ExampleResponse来定义返回结果格式。

在Vue3组件中使用getExample方法:

import { defineComponent, ref } from 'vue';
import { getExample } from '@/utils/api';
import { ExampleResponse } from '@/types/example';

export default defineComponent({
  setup() {
    const response = ref<null | ExampleResponse>(null);

    async function getData() {
      try {
        response.value = await getExample();
        console.log(response.value);
      } catch (err) {
        console.log(err);
      }
    }

    return {
      response,
      getData
    }
  }
})

在上述代码中,我们使用defineComponent方法定义了一个Vue3组件,在该组件中定义了一个response对象,用于存储响应的数据。同时,我们定义了一个getData方法,使用async/await语法发送请求,并在成功返回响应时进行一些操作,例如将响应结果打印到控制台或将响应结果存储到response对象中。

至此,我们在Vue3中使用TypeScript对Axios进行封装,并结合Mock.js实现了开发中数据请求与模拟数据的应用,在实际开发中,我们可以结合实际情况进行适度修改和拓展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3和ts封装axios以及使用mock.js详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue给数组中对象排序 sort函数的用法

    当需要对数组中的对象按照某个属性进行排序时,可以使用Vue中的sort函数。sort函数可接受一个比较函数作为参数来排序。 下面是Vue中sort函数的用法: array.sort(compareFunction) 其中,array 表示待排序的数组,compareFunction 是一个可选的比较函数,用来指定数组排序规则,如果不指定,则元素按照字符串变量…

    Vue 2023年5月27日
    00
  • vue实现记事本功能

    下面详细讲解“Vue 实现记事本功能”的完整攻略: 准备工作 在使用 Vue 实现记事本功能之前,需要先安装 Vue 和其他依赖项。可以使用 npm 或 yarn 来安装。下面是在项目中使用 npm 安装所需依赖项的命令行: npm install vue npm install vue-router npm install vuex 添加路由 在 Vue …

    Vue 2023年5月29日
    00
  • vuex操作state对象的实例代码

    下面是详细讲解“Vuex操作state对象的实例代码”的攻略。 1. 理解Vuex和state对象的基本概念 Vuex是一个专门为Vue.js设计的状态管理库,主要用于管理Vue.js应用程序中的状态。在使用Vuex的过程中,最核心的概念就是state对象。 state对象是Vuex中的一个重要部分,它类似于Vue.js组件中的data对象,但是它被所有组件…

    Vue 2023年5月28日
    00
  • 基于vite2+Vue3编写一个在线帮助文档工具

    基于vite2+Vue3编写一个在线帮助文档工具的完整攻略如下: 1. 准备工作 首先,我们需要确保本地环境中安装好以下工具和库: Node.js Git Vue CLI Vite2 可以通过以下命令检查是否安装好: node -v npm -v git –version vue –version npm install -g create-vite-a…

    Vue 2023年5月27日
    00
  • 详解vue-cli项目中的proxyTable跨域问题小结

    我来详细讲解一下“详解vue-cli项目中的proxyTable跨域问题小结”的完整攻略。 何为proxyTable? 在Vue CLI项目中,如果需要服务端连接API接口进行数据交互,而此时请求的URL与服务端的域名不一致,就会产生跨域问题。解决此类跨域问题,我们通常会在前端环境下进行反向代理。而Vue CLI中则是采用proxyTable来进行跨域请求。…

    Vue 2023年5月28日
    00
  • Vue项目的网络请求代理到封装步骤详解

    下面我将为您讲解“Vue项目的网络请求代理到封装步骤详解”的完整攻略。 一、配置跨域请求代理 在 Vue 项目中,我们要请求后端资源,遇到运行时跨域问题,通常有以下几种解决方案: 1. 使用 JSONP JSONP 通过 script 标签的 src 属性请求服务器获取数据,由于 script 标签的 src 属性不受同源策略限制,所以可以跨域请求。但是 J…

    Vue 2023年5月27日
    00
  • Vue页面骨架屏的实现方法

    当用户访问页面时,如果页面加载速度很慢,很容易造成用户的不耐烦和流失,导致用户体验降低。为了避免这种情况的发生,可以使用 skeleton screen(骨架屏)技术,即在页面加载过程中,先呈现出一个简单的页面骨架,等到页面加载完成后,再把数据填充到页面中,使得用户不会感到过长的等待时间。 下面是实现Vue页面骨架屏的具体步骤: 1. 安装 vue-cont…

    Vue 2023年5月27日
    00
  • 手拉手教你如何处理vue项目中的错误

    手拉手教你如何处理Vue项目中的错误 在开发Vue项目过程中,我们时常会遇到各种错误和异常情况。快速定位和解决问题有助于提高开发效率和代码健壮性,以下是处理Vue项目中出现错误的完整攻略。 1. 错误的分类 Vue项目中出现的错误大致可以分为些类型: 语法错误(Syntax errors) 运行时错误(Runtime errors),如传入无效数据,调用不存…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部