Vue组件封装方案对比——v-if方式与内置component方式

news2025/2/28 7:06:14

        近期在准备搭建一个通用组件库,而公司现有的各个系统也已有自己的组件库只是没抽离出来,但是目前有两套不同的组件封装方案,所以对于方案的选择比较困惑,于是对两种方式进行了对比,结合网上找到的一些开源组件库进行分析。记录一下子叭!~

一、现有系统的组件设计思路

        目前,A系统和B系统两个项目中各自有设计自己的组件库,但由于底层封装方案不同,使用时的配置信息也有一些差别,可以通过比较常见的表格、表单组件作为例子直观感受一下。

二、组件封装的方式选择

        每个组件都有其特定的属性(props)、插槽(slots)和事件(events),这些构成了组件的 API。

props子组件接收的参数,最好用对象的写法,这样可以针对每个属性设置类型、默认值或自定义校验属性的值,还可通过type、validator、required等方式对输入进行验证
slot可以给子组件的特定位置动态插入一些内容或组件(模板)
event子组件可以通知父组件其内部状态的变化或用户的交互行为,使得父组件可以据此更新状态或执行其他操作(子组件在特定的情况下触发事件,父组件监听这些事件并作出响应)

组件封装的方式选择

  • 第一种,先设置好各种类型的组件,使用v-if逐个判断渲染(例子:A系统)
<el-form-item>
    <el-input v-if="item.type == $const.FormCompType.input" />
    <el-input-number v-if="item.type == $const.FormCompType.number" />
    <slot v-if="item.type == $const.FormCompType.slot" :item="item" :name="item.slotName" />
</el-form-item>
  • 第二种,利用vue内置的component组件,直接传入Element UI组件(例子:B系统)
<el-form-item>
  <component :is="item.type" />
</el-form-item>

        组件封装在实现表单动态渲染、实现表单可视化配置这方面的应用会比较丰富和直观一些,正好以上A系统中就采用了v-if方法,而B系统则采用了内置component的方法。

        下面,笔者将通过一个表格,从多个角度分析展示两种方案的区别。

v-if方式

component方式

封装繁琐程度

封装代码冗长

需要全面考虑到各种类型

代码简单直接

依靠<component :is="">可以实现任何组件

上手难易

上手简单

需要先学习配置规则

可维护性

因配置结构扁平而更容易定位一些

需要清楚地知道数据结构才能定位

配置方式

层级较少、集中且直观

但只能使用预先设计好的类型、或者更新丰富组件

层级较深、不够直观且容易形成套娃

但可设置的属性更加全面、无需在有新类型时更新组件,只要elementUI有的组件都能直接实现

扩展性

扩展性较好

  • 每次有新的表单控件类型,都必须预先封装、引入并注册才能使用
  • 添加或功能时,只需要在已有的框架内进行扩展,增加相应的判断逻辑和组件即可,不需要修改其他部分的代码

扩展性有限

  • 当需要添加新的表单控件类型或功能时,可能需要修改多处代码,或依赖于ElementUI的更新
  • 对于复杂的表单控件或自定义功能,可能需要重新编写大量代码,难以在现有基础上进行扩展

优势

抽象和重用提供抽象层,代码更清晰可维护,同时提高了组件的重用性

自定义和扩展性:通过type属性可方便地扩展新的控件类型,添加自定义逻辑和样式以满足项目的特定需求

易于管理和维护方便地调整界面结构和行为,需要修改表单控件时,只需修改相应组件,无需在多个地方更改和修改底层的UI组件库组件

灵活性:能够直接利用Element UI提供的丰富组件和特性,无需额外封装,开发效率高

减少封装成本无需投入时间和资源去封装每个表单控件和处理所有可能的边界情况

与库保持同步:UI组件库通常会持续更新和修复问题,直接使用库中的组件可以确保应用始终获得最新的功能和修复,降低了维护成本

快速集成:直接利用现有的 ElementUI 组件,可以快速集成到项目中,减少开发时间

劣势

封装成本高需要投入时间和资源去封装每个表单控件,并确保它们能够正确响应传入的配置

性能损失:可能会导致不必要的渲染和销毁,可能导致一定的性能损失,尤其是在渲染大型表单时。但是这种损失通常是可接受的,可得到优化的

维护性挑战:随着控件类型、数量和复杂度的增加,组件内部逻辑可能会变得复杂,维护起来较为困难

代码冗余:使用 v-if 进行条件渲染可能会导致代码冗余,尤其是在控件类型较多时

配置复杂性:对于复杂的表单或界面,直接传入Element UI组件可能需要更复杂的配置和属性管理,增加了开发的复杂性

缺乏抽象层:代码更依赖于特定的库实现,缺乏抽象层,代码结构可能不够清晰和易于维护

更难以定制封装组件可根据需要添加额外的逻辑或样式来定制组件的行为或外观。对于需要高度定制化的表单控件,直接使用库中的组件可能不够灵活

复用性差:每个表单控件都直接使用ElementUI组件,无法对它们进行统一的封装和扩展

维护成本高:随着组件类型的增加,代码变得难以维护,特别是当需要调整表单控件的样式或行为时,可能需要修改多个地方,维护较为繁琐

其它

  • 上传文件场景下配置依然简洁
  • 可给各组件添加自定义事件
  • 多个表单控件统一样式时,在封装层统一处理就好
  • 可在组件中设计好通用的校验规则
  • 上传文件场景下配置较麻烦
  • 应该如何给el-xxx添加这些事件呢?
  • 多个表单控件统一样式时,需要在JSON配置项里面重复写
  • 校验规则需要在每次使用的时候就写一遍

三、采取折中方式

        方案一和方案二都有各自的优势和不足,所以也许将两者综合一下,设计出第三种方案。

        ①先单独封装好各种类型的表单控件小组件,②再通过<component :is="">来动态渲染,保证高度的组件复用性和扩展性,并避开v-if判断;③对配置的数据结构进行调整使其更扁平化,降低使用门槛并提高开发效率。

        此时,整个组件封装的设计思路 be like:

         用文字描述上图所示的方案:

①在表单Form 上通过<component :is="">来动态渲染不同类型的表单控件小组件,

②对各种类型的控件进行独立封装、分开管理,并导入和注册

③根据需要,在各个小组件中添加一些自定义属性、样式和其他定制化功能等

        优势

▷ 高复用性:通过单独封装各种类型的表单控件小组件,实现了高度的组件复用

▷ 灵活性:通过封装各种表单控件小组件,可以确保每个组件都具备较高的可重用性和可扩展性。同时,使用<component :is="">可以根据配置动态渲染不同的组件,提供了更大的灵活性

▷ 易于维护:每一种特定的表单控件都有独立的封装组件,易于进行单独的维护和测试。每个表单控件都有明确的封装边界(内部实现细节被隐藏起来,只暴露必要的接口供外部使用),这有助于保持代码的模块化和可维护性

▷ 良好的扩展性:添加新的控件类型时,只需要创建新的封装组件并注册到组件库中即可

▷ 数据结构扁平化:通过调整数据结构,使得配置更加扁平、简洁直观和易于管理,更容易理解和操作,降低了使用门槛

        潜在问题

▷ 初期投入大需要投入较多的时间和精力来单独封装各种类型的表单控件小组件

▷ 组件间的耦合度:如果小组件之间的耦合度较高,可能会导致代码难以维护和扩展。因此,在封装组件时需要注意组件的独立性和可重用性

▷ 配置复杂性:虽然通过扁平化数据结构可以简化配置,但如果配置项过多或过于复杂,仍然可能导致配置过程变得繁琐。因此,需要仔细设计配置结构,确保其既简洁又易于理解

需要确保所有可能的组件都已经正确地引用和注册

        优化措施 

♢ 1. 优化配置结构

○ 减少嵌套层级:将原有的嵌套配置结构扁平化,减少层级深度,使配置更加直观。

○ 使用枚举或常量:对于配置中的某些固定值或选项,使用枚举或常量进行替换,避免硬编码和魔法值。

○ 提供默认值:为配置项提供合理的默认值,减少开发者在配置时的必要输入。

♢ 2. 简化组件接口

○ 明确输入输出:每个小组件应该有清晰的输入(props)和输出(events),避免过多的配置选项和复杂的事件处理。

○ 使用统一的接口规范:确保所有小组件都遵循相同的接口规范,这样开发者在使用时就不需要为不同组件学习不同的配置方式

♢ 3. 提高组件复用性

○ 使用插槽(Slots):在小组件中预留插槽,允许开发者自定义内容或扩展功能,提高组件的复用性和灵活性。

○ 提供通用功能:对于一些通用的表单控件功能(如验证、格式化等),可以在小组件中统一实现,减少开发者在每个表单字段上的重复工作。还可以预留一些前缀、后缀等配置。

♢ 4. 优化渲染性能

○ 使用v-show代替v-if:对于频繁切换显示/隐藏的场景,使用v-show可以避免不必要的组件销毁和重建,提高渲染性能。

按需加载:如果项目较大,可以考虑使用代码分割和异步组件技术,按需加载需要的表单控件小组件。

♢ 5. 提供示例和文档

○ 编写清晰的文档:为小组件和配置结构提供详细的文档说明,包括输入输出的参数、用法示例、注意事项等。

○ 提供示例代码:为常见使用场景提供示例代码,帮助开发者快速上手和理解如何使用这些小组件和配置。

♢ 6. 进行单元测试和集成测试

○ 编写单元测试:为每个小组件编写单元测试,确保它们的功能正确性和稳定性

○ 进行集成测试:对整个表单系统的不同配置和组合进行集成测试,确保在各种场景下都能正常工作。

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

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

相关文章

Matlab/simulink基于模糊PID智能控制的温度控制系统建模仿真

参考文献 Matlab/simulink基于模糊PID智能控制的温度控制系统建模仿真 该系统主要对某小区换热站的温度控制策略和控制方案进行了设计&#xff0c;其设计内 容主要包括三部分。首先是基于模糊PID智能控制的温度控制系统设计。在温度控制 算法方面&#xff0c;该设计于传统的P…

HarmonyOS鸿蒙开发常用4种布局详细说明

介绍一下鸿蒙开发常用4种布局 1、线性布局 2、层叠布局 3、网格布局 4、列表布局 ​1. 线性布局&#xff08;Column/Row&#xff09; 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器Row&#xff08;行&#xff09;和Column&…

模块化项目Eclipse测试网零撸教程

简介&#xff1a;Eclipse 是一个基于 Solana 区块链的初创项目&#xff0c;致力于构建基于 Solana 虚拟机的通用 Layer2 解决方案&#xff0c;为以太坊提供更快速、更通用的 Rollup 技术。其主要用途是为开发者提供构建基于 Solana 虚拟机的 Rollup 应用的平台&#xff0c;解决…

推荐一款好用的前端分页插件jqPaginator

jqPaginator 简洁、高度自定义的jQuery分页组件&#xff0c;适用于多种应用场景。 现在网上各种各样的分页组件很多&#xff0c;但是很难找到十分“称心如意”的&#xff0c;于是jqPaginator诞生了。 我心中理想的分页组件&#xff0c;要不受CSS框架限制&#xff0c;可以使用…

Redis教程——Redis入门

Redis Redis是一种开源内存中数据结构存储&#xff0c;用于数据库、缓存、消息代理和流引擎&#xff0c;其提供了丰富的数据结构&#xff0c;例如&#xff1a;字符串、哈希、列表、有序集合等。 Redis内置了复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久化&#xff0c;并…

软考76-上午题-【面向对象技术3-设计模式】-创建型设计模式01

一、创建型设计模式一览 二、创建型设计模式 2-1、创建型设计模式的概念 一个类创建型模式使用继承改变被实例化的类&#xff1b; 一个对象创建型模式将实例化委托给另一个对象。 对应java的new一个对象。 2-2、简单工厂模式&#xff08;静态工厂方法&#xff09; 简单工厂…

XDP学习笔记

XDP的使用与eBPF程序分不开&#xff0c;因此要了解学历XDP&#xff0c;须知道什么是eBPF、什么是XDP。 概念 eBPF BPF&#xff08;Berkeley Packet Filter&#xff09;是一种灵活且高效的数据包过滤技术&#xff0c;最初由 BSD Unix 中的网络子系统引入&#xff1b;BPF 允许用…

基于模型分割的联邦学习

加速局部模型的拟合&#xff1a;根据网络状态的不同&#xff0c;提出一种基于模型分割的端边云协同训练算法&#xff0c;加速FL本地训练&#xff1b;设计一种多轮迭代再聚合的模型聚合算法&#xff0c;加速FL聚合 采用分支DNN对数据进行训练 DNN分割是指利用深度神经网络&…

(学习日记)2024.03.13:UCOSIII第十五节:基于时基列表的时延操作(持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

虚拟宇宙如何重塑酒店和旅游业的未来

全球酒店业正在积极适应新兴的元宇宙&#xff0c;早期采用者率先推出了创新的数字解决方案。企业越来越多地采用颠覆性技术&#xff0c;从最初的非接触式服务和自动聊天机器人的客户服务转变为变革性的转变。随着数字环境的不断发展&#xff0c;世界各地的酒店业参与者正在投资…

1.python安装

1.检查是否已经安装python 打开cmd 输入 python --version查看是否有返回版本,没有返回则环境变量未设置好,或者未安装 2.下载安转python https://www.python.org/downloads/windows/ 勾选配置环境变量路径 安装成功

资深老鸟经验,性能测试-性能指标分析总结,一篇策底概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试指标 1、…

【微服务】分布式调度框架PowerJob使用详解

目录 一、前言 二、定时任务调度框架概述 2.1 为什么需要定时任务调度框架 2.2 定时任务调度使用场景 三、PowerJob 介绍 3.1 PowerJob 概述 3.2 PowerJob 功能特性 3.3 PowerJob 应用场景 3.4 PowerJob 与其他同类产品对比 四、PowerJob 部署 4.1 PowerJob 架构 4.…

微信小程序Skyline模式自定义tab组件胶囊与原生胶囊平齐,安卓和ios均自适应

进入下面小程序可以体验效果&#xff1a; 至于原理的话&#xff0c;解释起来毕竟麻烦&#xff0c;各位可以看源码自己分析。其实很简单&#xff0c;就算计算布局。很多网上公布的布局&#xff0c;都不能正常自适应。在下这个是完美可以的 1、WXML <view class"weui…

Flask学习(四):路由转换器

默认的路由转换器&#xff1a; string &#xff08;缺省值&#xff09; 接受任何不包含斜杠的文本int接受正整数float接受正浮点数 path类似 string&#xff0c;但可以包含斜杠uuid接受 UUID 字符串 代码示例&#xff1a; app.route(/user/<username>) def show_u…

【Jetson Nano】jetson Nano安装pytorch and torchvision

Pytorch是著名的人工智能框架&#xff0c;在部署人工智能项目的时候&#xff0c;就需要在嵌入式开发板上安装pytorch&#xff0c;下面就详解介绍关于安装pytorch的步骤 1.更换apt源 首先检查apt源是否已经是国内镜像源 输入&#xff1a; sudo apt-get update如果不是国内镜像…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

FMR-NET:一种用于弱光图像增强的快速多尺度残差网络

这是本人发表的第二篇文章&#xff0c;目前已经见刊。欢迎大家引用。 文章链接&#xff1a;FMR-Net: a fast multi-scale residual network for low-light image enhancement | Multimedia Systems (springer.com) 代码链接&#xff1a;Github CSDN 这篇文章的特色在于&…

1、鸿蒙学习-为应用/服务进行签名

针对应用/服务的签名&#xff0c;DevEco Studio为开发者提供了自动签名方案&#xff0c;帮助开发者高效进行调试。也可选择手动方式对应用/服务进行签名&#xff0c;如果使用了需要ACL的权限&#xff0c;需采用手动方式进行签名。 自动签名 说明 使用自动签名前&#xff0c;请…

碳素光线疗法与中医

看得见的穴位碳素光线疗法 最近日本的医疗随着科学技术的发达&#xff0c;在基础研究、临床各领域取得了显著的发展。日本人的平均寿命比战前大幅延长&#xff0c;结核及其他疑难杂症、癌症等疾病也在逐渐被压制。其中&#xff0c;作为癌症的辅助疗法&#xff0c;日本癌症学会等…