【前端】 Vue 3 中二次封装组件

在 Vue 3 中二次封装组件是提高代码复用性和维护性的重要手段。以下是详细的封装方法和最佳实践:


一、封装原则

  1. 功能扩展:在原有组件基础上添加新功能
  2. 定制样式:统一项目的 UI 设计规范
  3. 简化接口:隐藏复杂逻辑,提供简洁的 API
  4. 复用逻辑:封装可复用的业务逻辑

二、基础封装方法

1. 属性透传(Props)
<script setup>
import BaseButton from './BaseButton.vue'const props = defineProps({// 扩展原生属性size: {type: String,default: 'medium'},// 新增自定义属性loading: Boolean
})
</script><template><BaseButtonv-bind="$attrs"  // 透传所有未声明的属性:class="[`btn-size-${size}`,{ 'is-loading': loading }]"><slot /> <!-- 插槽透传 --></BaseButton>
</template>
2. 事件透传
<script setup>
const emit = defineEmits(['click', 'custom'])function handleClick(e) {// 执行扩展逻辑console.log('扩展的点击处理')// 透传原始事件emit('click', e)// 触发自定义事件if (e.target.value) {emit('custom', e.target.value)}
}
</script><template><BaseInput @click="handleClick"@focus="$emit('focus', $event)"  // 直接透传/>
</template>

三、高级封装技巧

1. 插槽透传(包含作用域插槽)
<template><BaseTable><!-- 默认插槽 --><slot /><!-- 具名插槽透传 --><template v-for="(_, slotName) in $slots" #[slotName]="scope"><slot :name="slotName" v-bind="scope || {}"/></template><!-- 扩展功能插槽 --><template #actions="scope"><div class="custom-actions"><slot name="custom-actions" v-bind="scope"/><button @click="handleExtraAction">+</button></div></template></BaseTable>
</template>
2. 方法暴露(使用 defineExpose)
<script setup>
import { ref } from 'vue'const innerComponent = ref(null)// 封装内部组件的 focus 方法
function focus() {innerComponent.value?.focus()
}// 暴露给父组件的方法
defineExpose({focus,customMethod: () => console.log('自定义方法')
})
</script><template><BaseInput ref="innerComponent" />
</template>
3. 全局配置注入
<script setup>
import { inject } from 'vue'// 注入全局配置
const globalConfig = inject('formConfig', {labelWidth: '120px',validateOnChange: true
})const props = defineProps({// 允许组件级覆盖全局配置labelWidth: String
})// 最终使用的配置
const actualLabelWidth = computed(() => props.labelWidth || globalConfig.labelWidth
)
</script>

四、最佳实践

1. 支持 TypeScript 类型
<script setup lang="ts">
import type { BaseButtonProps } from './BaseButton.vue'interface ExtendedProps {// 新增属性loading?: boolean// 继承基础组件的类型color?: 'primary' | 'success' | 'warning'
}// 合并原始属性和扩展属性
defineProps<BaseButtonProps & ExtendedProps>()
</script>
2. 默认值处理(合并策略)
<script setup>
import { computed } from 'vue'const props = defineProps({modelValue: { type: [String, Number], default: '' },config: {type: Object,default: () => ({maxLength: 100,showCounter: true})}
})const mergedConfig = computed(() => ({maxLength: 200, // 覆盖默认值showCounter: props.config.showCounter, // 继承配置trimOnBlur: true // 新增功能
}))
</script>
3. 样式封装(Scoped CSS)
<style scoped>
/* 深度选择器修改子组件样式 */
:deep(.base-input__inner) {border-radius: 8px;
}/* 封装通用样式类 */
.btn.primary {background: linear-gradient(to right, #ff8a00, #da1b60);
}
</style>

五、完整示例:封装一个增强型 Input

<template><div class="enhanced-input"><label v-if="label">{{ label }}</label><BaseInput:modelValue="innerValue"v-bind="filteredAttrs":class="{ 'has-error': errorMessage }"@update:modelValue="handleChange"><template #prefix><slot name="prefix" /></template></BaseInput><div v-if="showCounter" class="counter">{{ valueLength }}/{{ maxLength }}</div><div v-if="errorMessage" class="error">{{ errorMessage }}</div></div>
</template><script setup>
import { computed, ref, watch, useAttrs } from 'vue'const props = defineProps({modelValue: [String, Number],label: String,maxLength: {type: Number,default: 100},rules: Array // 校验规则
})const emit = defineEmits(['update:modelValue', 'change'])const attrs = useAttrs()
const innerValue = ref(props.modelValue)
const errorMessage = ref('')// 过滤不需要透传到 BaseInput 的属性
const filteredAttrs = computed(() => {const { label, rules, ...rest } = attrsreturn rest
})// 值处理
const valueLength = computed(() => innerValue.value?.toString().length || 0)
const showCounter = computed(() => props.maxLength > 0)// 值变化处理
function handleChange(value) {innerValue.value = valueemit('update:modelValue', value)emit('change', value)validate(value)
}// 校验逻辑
function validate(value) {if (!props.rules) returnconst rule = props.rules.find(rule => {if (rule.required && !value) return trueif (rule.pattern && !rule.pattern.test(value)) return true// 可扩展更多规则...})errorMessage.value = rule ? rule.message : ''
}// 暴露验证方法
defineExpose({ validate })
</script>

六、封装建议

  1. 保持接口简单:避免暴露过多内部细节
  2. 遵循约定大于配置:提供合理的默认值
  3. 文档注释:使用 JSDoc 说明组件用法
  4. 可组合性:将复杂组件拆分为多个小组件
  5. 错误处理:添加边界情况处理
  6. 类型安全:为 TypeScript 项目提供类型定义

通过合理封装,可以显著提高开发效率和代码质量。建议根据实际项目需求选择合适级别的封装,避免过度封装导致的维护成本增加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85123.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式词表示(Distributed Word Representation):自然语言处理的核心基石

分布式词表示&#xff08;Distributed Word Representation&#xff09;&#xff1a;自然语言处理的核心基石 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;如何将离散的词汇转化为计算机可理解的数值形式&#xff0c;一直是技术突破的关键。传统的独热编码&…

Windows Playwright NotImplementedError问题深究

原文链接&#xff1a;Windows Playwright NotImplementedError问题深究 < Ping通途说 0. 引言 今天来看一下这个困扰我很久的问题。是关于在FastAPI / NiceGUI 等基于Uvicorn环境下使用Async Playwright 提示NotImplementedError的问题。 本解决方案仅适用基于Uvicorn的异步…

QCustomPlot 数据可视化方式详解

QCustomPlot 数据可视化方式详解 QCustomPlot 提供了多种灵活的数据显示方式,可以满足从简单静态图表到复杂实时数据可视化的各种需求。以下是 QCustomPlot 显示数据的核心方式和策略: 基本数据显示方式 1.1 完整数据设置 (setData)// 一次性设置完整数据集 QVector<doub…

家用旧电脑搭建小型服务器操作步骤教程:一步一步本地部署到公网访问

你家是不是也有一台吃灰的旧电脑&#xff1f;别急着扔&#xff0c;它其实还能发挥大作用&#xff01;小编最近就把家里一台十年前的老台式机&#xff0c;改造成了一个小型服务器&#xff0c;主要用来文件备份、当网站测试环境&#xff0c;还是比较有用的。今天就来手把手教你&a…

Python银行账户系统全解析

完整代码如下&#xff1a; class BankAccount:def __init__(self, account_holder, initial_balance0):"""初始化银行账户:param account_holder: 账户持有人姓名:param initial_balance: 初始余额&#xff0c;默认为0"""self.account_holder …

博世X阿里云:智能座舱接入通义大模型!

近日,全球领先的汽车技术与服务商博世与阿里云宣布在大模型领域达成合作,通义大模型助力博世加速AI技术应用于智能座舱,首次实现座舱环境主动感知和3D数字人交互。 博世AI智能座舱技术原型由博世智能驾控事业部以通义千问和通义万相为基础,结合阿里云百炼大模型服务平台和磐曦数…

高性能计算服务器的主要作用都有哪些?

高性能计算服务器是一种专门为了处理大规模科学计算和数据分析任务所设计的服务器&#xff0c;高性能计算服务器拥有着强大的计算能力和高速的数据传输能力&#xff0c;有着高度的可靠性和可扩展性&#xff0c;下面小编就来介绍一下高性能计算服务器的主要作用吧&#xff01; 高…

C++ 进阶:深入理解虚函数、继承与多态

前言 在 C 的面向对象编程中&#xff0c;继承和多态是两个核心概念。今天我们将深入探讨 C 中与多态密切相关的几个重要特性&#xff1a;虚函数、virtual 关键字、override 关键字、多重继承以及虚继承。这些内容是理解 C 多态机制和复杂类层次结构的关键。 虚函数与 virtual…

为AR眼镜等多种智能可穿戴设备添加穿戴状态检测功能

作者&#xff1a;Azoteq中国 随着AR/VR眼镜、头戴式耳机和入耳式耳塞、智能手表和健身手环等可穿戴电子产品受到越来越多消费者的欢迎&#xff0c;如何设计外形更加时尚迷人、功能更加先进宜人的穿戴产品成为了创新和创意的焦点。作为全球领先的多传感器解决方案提供商&#xf…

腾讯云国际站缩容:策略、考量与实践

腾讯云国际站作为连接全球业务的重要云计算枢纽&#xff0c;其资源的灵活调配至关重要。而腾讯云国际站缩容&#xff0c;便是企业在特定发展阶段或业务场景下需要深入探究的关键议题。 一、腾讯云国际站缩容的背景与动因 随着企业业务的动态发展&#xff0c;市场需求并非一成…

英语写作核心词汇

以下是一些非常常见和实用的单词和短语分类整理&#xff1a;​ 1. 核心高频动词 (用于表达观点、影响、变化等) ​Affect (v.): 影响​Cause (v.): 引起&#xff0c;导致​Influence (v./n.): 影响​Benefit (v./n.): 有益于&#xff1b;好处​Harm (v./n.): 损害&#xff1b…

Python函数参数传递机制全解析

Python常见问题解答 1. 函数参数传递是值传递还是引用传递&#xff1f; Python中的参数传递是"对象引用传递"&#xff08;或称为"共享对象传递"&#xff09;。具体来说&#xff1a; 对于不可变对象&#xff08;如数字、字符串、元组&#xff09;&#x…

MATLAB提供的预训练神经网络

CNN 预训练的神经网络 Deep Learning Toolbox™ provides various pretrained networks that have different sizes, speeds, and accuracies.

【PDF】Qt生成PDF文件,占用存储小

在 Qt 项目中&#xff0c;如果你希望使用第三方开源库来生成心电图的 PDF 报告&#xff0c;并且要求占用磁盘空间最小&#xff0c;以下是一些推荐的选择&#xff1a; 推荐的开源库 PoDoFo 简介&#xff1a;PoDoFo 是一个用于创建和操作 PDF 文件的 C 开源库。它非常轻量级&…

系统架构设计师 1

第一章 绪论 系统架构设计师(System Architecture Designer)是项目开发活动中的关键角色之一。系统架构是系统的一种整体的高层次的结构表示&#xff0c;是系统的骨架和根基&#xff0c;其决定了系统的健壮性和生命周期的长短。 1.1 系统架构概述 1946年第一台计算机&#x…

2023年面试记录(base杭州)

阿里外包&#xff08;通过&#xff09; 一面&#xff1a; 1、react 常用hook 2、css的重绘和重排 后面如果进入还有两轮 二面&#xff1a; 1、解决不同版本的兼容问题能句几个例子吗 2、FCP和 CLS 这两个指标是什么意思能讲下吗 3、具体优化的动作是什么呢 4、放到cdn上为什么…

React 国际化方案最佳实践调研

文章目录 前言主流国际化库对比分析翻译资源管理策略语言切换方式与自动识别Next.js 中的国际化支持Page Router 模式&#xff08;pages 目录&#xff09;App Router 模式&#xff08;app 目录&#xff09; 多语言 SEO 与预渲染注意事项企业级多语言开发与协作流程建议 前言 整…

基于Python实现自然语言处理(主题层次的情感分类)

主题层次的情感分类 1 任务及数据集介绍 该项目作业的具体任务是来自于 BDCI2018-汽车行业用户观点主题及情感识别的题目。数据是网络中公开的用户对汽车相关内容的评价文本。此任务是对每条文本内容&#xff08;即用户评论&#xff09;进行分析&#xff0c;确定该条评论中讨…

SpringBoot 线程池 配置使用详解

一、核心特性 Springboot 集成 支持 Async 注解&#xff0c;简化异步方法调用。 参数可配置化 核心线程数、最大线程数、队列容量、拒绝策略等均可通过配置调整。 生命周期管理 实现 Lifecycle 接口&#xff0c;支持线程池的启动和关闭&#xff08;如应用关闭时优雅终止任务…

Elasticsearch/OpenSearch MCP Quickstart

项目概述 elasticsearch-mcp-server 是一个基于 Model Context Protocol (MCP) 的服务器实现&#xff0c;提供了与 Elasticsearch 和 OpenSearch 交互的能力。该服务器允许用户搜索文档、分析索引以及管理集群&#xff0c;通过一系列工具函数实现这些功能。 项目结构 项目主…