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

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中的 watch监听属性详情

    Vue中的watch是用来监听数据变化,并根据变化执行某些操作的一个高级选项。它包含一个监听对象和一个处理函数,当监听对象发生变化时,处理函数就会被执行。在Vue中watch有多种不同的使用方式,下面将介绍Vue中的watch监听属性的详细攻略。 1.什么是watch 在Vue中,我们通常使用computed属性来根据数据的变化,生成新的派生数据,并更新视图…

    Vue 2023年5月27日
    00
  • 使用Vue实现一个树组件的示例

    下面是使用Vue实现一个树组件的完整攻略。 确定需求 在实现一个树组件之前,首先需要明确需求,确定树组件需要实现的功能和样式等。例如,树组件需要拥有以下功能: 以树状结构展示数据; 支持节点的折叠和展开; 支持节点的选中和取消选中; 支持自定义节点的内容和样式。 根据以上需求,我们可以开始编写树组件的代码。 实现树组件 编写组件基础结构 使用Vue实现树组件…

    Vue 2023年5月28日
    00
  • vue.js给动态绑定的radio列表做批量编辑的方法

    针对这个问题,我将为您提供关于Vue.js实现动态绑定radio列表批量编辑的完整攻略,以下是具体步骤: 步骤一:定义数据 首先需要定义一个数组来存储动态生成的radio列表,例如: data() { return { options: [ {id: 1, value: ‘option1’, checked: false}, {id: 2, value: ‘…

    Vue 2023年5月29日
    00
  • Vue props用法详解(小结)

    Vue props用法详解(小结) 在Vue中,props是一个常用的属性传递方式。它允许你从父组件向子组件传递数据。 基本用法 父组件中,使用v-bind指令向子组件传递数据。子组件中,定义props属性接收数据。 以下是一个简单的例子: <!– 父组件 –> <template> <div> <child-c…

    Vue 2023年5月27日
    00
  • vue导出excel表格的新手详细教程

    下面是“vue导出excel表格的新手详细教程”的完整攻略: 1. 安装依赖 首先,我们需要安装两个依赖包,file-saver和xlsx,分别用于文件保存和Excel表格的生成: npm install file-saver xlsx –save 2. 生成Excel文件 在Vue组件中,我们创建一个可以导出表格数据的方法,该方法需要调用xlsx库中的u…

    Vue 2023年5月27日
    00
  • Vuex模块化和命名空间namespaced实例演示

    下面是关于Vuex模块化和命名空间namespaced实例演示的详细讲解: 什么是Vuex模块化? 在一个大型的Vue项目中,为了更好地管理应用状态,我们需要把Vuex中的各个部分拆分成多个模块。这样做的好处是让各个部分相对独立,以便更好地维护和扩展。 模块化让我们可以使用Vuex.Store构造函数中的modules属性来构建多个子模块。每个子模块都拥有自…

    Vue 2023年5月28日
    00
  • 如何在Vue3中实现自定义指令(超详细!)

    下面是关于如何在Vue3中实现自定义指令的完整攻略。 什么是自定义指令 在Vue中,指令是一种带有v-前缀的特殊属性。指令具有独特的行为和功能,例如v-bind可以将元素的属性与Vue实例中的数据绑定,v-on可以监听事件等。Vue允许我们注册自己的自定义指令。 在Vue3中注册自定义指令 在Vue3中,我们可以使用DirectiveAPI来注册自定义指令。…

    Vue 2023年5月28日
    00
  • vue实现的请求服务器端API接口示例

    下面我将为你详细讲解“vue实现的请求服务器端API接口示例”的完整攻略。 1. 准备工作 在开始实现“vue实现的请求服务器端API接口示例”之前,需要做一些准备工作: 确定需要请求的API接口地址:这个可以向后端开发人员询问。 安装vue-resource插件:vue-resource是Vue.js官方推荐的插件,用于处理Ajax请求。你可以通过npm安…

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