Vue3二次封装 提升开发效率与组件复用性的实践

在 Vue3 开发中,二次封装是优化组件使用、提升项目可维护性的重要手段。通过对基础组件(如 UI 组件库的组件、原生 DOM 相关功能等 )进行针对性封装,能让组件更贴合业务场景,降低重复代码量,加速开发流程。本文将带你深入了解 Vue3 二次封装的思路、常用场景与实现要点,助力打造更高效的前端组件体系

(一)业务定制化适配

UI 组件库(如 Element Plus、Ant Design Vue 等 )提供的基础组件,往往是通用形态。实际业务里,像按钮需统一携带 “业务专属样式、权限判断逻辑”,表格要默认集成 “自定义列配置、请求封装”,二次封装能让这些定制逻辑下沉到组件层,业务页面直接用 “适配后的组件”,无需重复写冗余代码。

(二)复用逻辑沉淀

项目中,多个页面可能用到 “带加载状态的下拉选择、关联接口请求的搜索框” 等功能。把这些复用逻辑封装成独立组件,后续直接调用,能大幅减少重复开发,也便于统一维护(比如接口地址变更,只需改封装组件 )。

(三)降低使用复杂度

原生组件或第三方库的 API 可能较复杂,二次封装可简化调用。例如封装一个 UploadImage 组件,内部处理 “图片压缩、格式校验、上传接口对接”,业务侧只需传入 “图片类型限制、最大尺寸” 等简单参数,就能快速实现上传功能。

在最外围创建三个.env文件

第一个(开发环境)文件名称(.env.development)

NODE_ENV = 'development'
VUE_APP_MODE = 'development'
VUE_APP_API_URL = 'https://testshool.zzgoodqc.cn'//接口前缀

第二个(正式环境)(.env.production)

NODE_ENV = 'production'
VUE_APP_MODE = 'production'
VUE_APP_API_URL = 'https://testshool.zzgoodqc.cn'//接口前缀

第三个(测试环境)(.env.test)

NODE_ENV = 'test'
VUE_APP_MODE = 'test'
VUE_APP_API_URL = 'https://testshool.zzgoodqc.cn'//接口前缀
outputDir = test

接下来就是一次封装的方法:

在vue3的src目录中创建一个utils文件,在utils中进行一次封装 

一次封装axios.ts(在src中创建)

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

// 设置请求超时时间,单位为毫秒
axios.defaults.timeout = 30000;

// 根据环境变量设置请求的基础URL
axios.defaults.baseURL = process.env.VUE_APP_API_URL;

// 可以添加拦截器
if (process.env.VUE_APP_MODE === 'development') {
    console.log('开发');
} else if (process.env.VUE_APP_MODE === 'test') {
    console.log('测试');
} else {
    console.log('正式');
}

// 定义请求参数的类型
interface RequestOptions {
    url: string;
    method?: string;
    data?: any;
}

// 封装请求函数
export const request = (options: RequestOptions): Promise<any> => {
    return new Promise((resolve, reject) => {
        const config: AxiosRequestConfig = {
            url: options.url,
            method: options.method || 'GET',
            [options.method?.toLowerCase() === 'get' ? 'params' : 'data']: options.data || {},
        };
        axios(config)
            .then((res: AxiosResponse) => {
                resolve(res.data);
            })
            .catch((err) => {
                reject(err);
            });
    });
};

在utils中进行二次封装 在utils中继续创建一个(api.ts)

import { request } from './axios';//引入一次封装

// 定义请求数据的类型
interface GetNolistRequestData {
  // 这里可以根据实际情况添加具体的字段
  [key: string]: any;
}

// 定义响应数据的通用类型
interface ApiResponse<T> {
  code: number;
  message: string;
  data: T;
}

export const getNolist = (data: GetNolistRequestData) => {
  return request({
    //.env文件中是文件前缀选择只需要把前缀后的复制上来就好
    url: '/index.php/index/Yimi/getGoodsList',
    method: 'get',
    data: data // 使用 data 传递参数
  });
};

在需要的页面中引入

import { api中你起的变量名称 } from '@/utils/api';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值