🧱 如何设计一个“真正可复用”的前端组件?

🔧 一个按钮可以写10次,也可以封装一次复用全场;组件是前端的积木,而设计模式才是组装它们的说明书。你真的在写“可复用”组件吗?


🧠 什么是可复用组件?

所谓“可复用”,不仅是复制粘贴组件这么简单,而是:

✅ 能跨多个页面/模块使用
✅ 能被复合、嵌套、组合
✅ 能支持灵活配置和扩展
✅ 能隔离内部逻辑,隐藏实现细节
✅ 能在多个项目中迁移使用(库化)


🧩 核心原则一:面向配置编程(Props 设计)

以一个弹窗组件为例:

<Modaltitle="提示"visible={visible}onClose={() => setVisible(false)}footer={<CustomFooter />}
/>

✅ 好的 Props 应该:

特性示例
🧠 可读性强title="登录提示"t="登录"
🧩 支持组合footer 支持传 JSX 或隐藏
🎯 默认值合理closable=true 不传也能用
🚀 高扩展性beforeClose() 钩子支持拦截关闭

🧩 核心原则二:关注点分离(拆 UI 和逻辑)

避免在组件中同时处理:

  • UI 渲染
  • 状态管理
  • 数据获取
  • 事件逻辑

✅ 推荐:UI 组件 + Hook/Composable 分离逻辑

React 示例(Hooks):

function useModal() {const [visible, setVisible] = useState(false);const open = () => setVisible(true);const close = () => setVisible(false);return { visible, open, close };
}

组件层只负责渲染:

<Modal visible={visible} onClose={close} />

Vue 示例(Composable):

export function useModal() {const visible = ref(false);const open = () => (visible.value = true);return { visible, open };
}

🧩 核心原则三:插槽 & Render Props 让组件更灵活

Vue 中使用 slot

<CustomTable><template #toolbar><Button>新增</Button></template>
</CustomTable>

React 中使用 children 或 render props:

<TablerenderToolbar={() => (<Button>新增</Button>)}
/>

插槽 / Render Props 是组件复用的“开放式接口”。


🧩 核心原则四:可组合的组件设计(组合 > 继承)

一个“组合式”的 Form 组件架构 👇

<Form><Form.Item label="用户名"><Input /></Form.Item><Form.Item label="密码"><Input type="password" /></Form.Item>
</Form>
  • Form 管理上下文(如验证、收集值)
  • Form.Item 管理 label、错误提示
  • Input 专注输入逻辑

优点:

  • ✅ 结构清晰
  • ✅ 容易插拔/扩展
  • ✅ 内聚逻辑解耦封装

🔧 技术加持:让组件更强大的方法

技术作用
TypeScript 泛型精确 props 类型,支持 IDE 提示
事件派发 / 自定义事件组件内向外传递操作
Context / Provide/Inject实现跨层通信
组合式函数(Hooks/Composables)提取公共逻辑
主题系统 / 样式变量实现定制化风格

🧪 示例:一个「超可复用」的 Table 组件设计思路

✅ 配置式 + 插槽:

<Tablecolumns={[{ title: '名称', dataIndex: 'name' },{ title: '年龄', dataIndex: 'age', render: val => <Tag>{val}</Tag> },]}dataSource={data}
/>

✅ 扩展:支持分页、loading、自定义操作栏、空状态提示等:

<Tablecolumns={columns}dataSource={data}loading={loading}pagination={{ current: 1, pageSize: 10 }}emptyTip={<Empty description="暂无数据" />}
/>

这样封装后,整套表格系统可被复用于几十个页面。


⚠️ 不可复用组件的常见“反模式”

反模式问题
Props 拆得太碎使用复杂,传值不直观
写死业务逻辑拖不动、迁不走、复用不了
没有状态控制出口用户无法控制内部行为
样式不隔离每次引入就“爆炸”
接口数据写死在组件里不通用,只能在一个项目用

🧠 总结:可复用组件的五个关键特性

  1. 低耦合:功能单一,职责清晰
  2. 高内聚:UI 与状态适度绑定
  3. 可组合:支持嵌套、插槽、自定义结构
  4. 可配置:props + config 驱动行为
  5. 可扩展:暴露必要事件、方法,便于集成与增强

组件写得好,维护效率能提升一个维度;写得乱,整个项目都跟着混乱。


👍 如果你觉得这篇文章有帮助,欢迎点赞、关注、收藏,下一篇为大家带来《如何打造一个通用表单生成器组件系统》

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

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

相关文章

AlpineLinux安装RabbitMQ及其管理界面

AlpineLinux安装RabbitMQ及其管理界面 本文以 alpine linux 的 3.21版本为例,演示对于 RabbitMQ 在Linux 下的安装,其他发行版本大同小异。主要是包管理软件的命令区别,以及在线仓库提供的 RabbitMQ 版本差异而已。 (一)安装 Erlang 因为 RabbitMQ 是用 Erlang 语言编写…

3S技术+ArcGIS/ENVI全流程实战:水文、气象、灾害、生态、环境及卫生等领域应用

系统梳理3S技术的核心理论与实战应用&#xff0c;涵盖ArcGIS与ENVI软件操作、空间数据管理、地图投影转换、遥感影像解译、DEM地形分析、空间插值建模等关键技能&#xff0c;并结合农业、气象、生态、灾害等跨学科案例&#xff0c;提供从数据获取到高级可视化的完整解决方案。无…

弹窗中el+table,二次打开弹窗,选择列会携带第一次选择的数据

1第一次打开弹窗选择的数据&#xff0c;正确&#xff0c;然后关闭弹窗再次打开弹窗&#xff0c;重新选择&#xff0c;第二次的数据&#xff0c;错误在打开弹窗/关闭弹窗等位置全部做了置空处理&#xff0c;以下是代码&#xff1a;最后的原因是&#xff1a;el-dailog 自带缓存&a…

RocketMQ在Spring Boot中的详细使用指南

📋 目录 🚀 RocketMQ简介 什么是RocketMQ? 核心概念 🏗️ 基础架构组件 📝 重要概念解释 🔧 环境搭建 1. RocketMQ服务端安装 Docker方式(推荐初学者) 手动安装方式 2. 验证安装 🏗️ Spring Boot集成配置 1. 添加依赖 2. 配置文件 application.y…

基于Java+Springboot的医院档案管理系统

源码编号&#xff1a;S597源码名称&#xff1a;基于Springboot的医院档案管理系统用户类型&#xff1a;多角色&#xff0c;用户、医护人员、管理员数据库表数量&#xff1a;11 张表主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven运行环境&#xff1a;Windows/M…

Pandas 学习教程

目录 定义 基本操作 一维数组操作 二维数组操作 数据选择过滤 数据处理 数据清洗 数据转换 数据分析 排序 分组聚合 数据透视表 高级操作 合并数据 时间序列处理 自定义函数调用 数据可视化集成 数据导出和导入 大数据分块处理 定义 全称&#xff1a; panel da…

QueryWrapper 类的作用与示例详解

通俗易懂的解释想象一下你去图书馆找书&#xff1a;QueryWrapper 就像是一个智能的图书管理员你告诉管理员你的需求&#xff1a;"我要找计算机类、2020年后出版的、作者是张三的书"管理员会根据你的要求组合查询条件&#xff0c;然后去书库帮你找书在编程中&#xff…

【PyTorch】PyTorch中torch.nn模块的循环层

PyTorch深度学习总结 第九章 PyTorch中torch.nn模块的循环层 文章目录PyTorch深度学习总结前言一、循环层1. 简单循环层&#xff08;RNN&#xff09;2. 长短期记忆网络&#xff08;LSTM&#xff09;3. 门控循环单元&#xff08;GRU&#xff09;4. 双向循环层二、循环层参数1. …

Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。

Ubuntu 24.04 LTS 服务器配置&#xff1a;安装 JDK、Nginx、Redis。新建用来放置软件安装包的目录 mkdir /home/software 配置目录所有者为 ubuntu 用户&#xff1a; chown ubuntu /home/software将软件安装包上传到 /home/software配置 JDK-8 新建 jdk 安装目录 mkdir /usr/ja…

工作中用到过哪些设计模式?是怎么实现的?

1. 单例模式&#xff08;结合 Spring Component&#xff09;场景&#xff1a;配置中心、全局状态管理 Spring 实现&#xff1a;java// 自动注册为Spring Bean&#xff08;默认单例&#xff09; Component public class AppConfig {Value("${server.port}")private in…

Leetcode 3609. Minimum Moves to Reach Target in Grid

Leetcode 3609. Minimum Moves to Reach Target in Grid 1. 解题思路2. 代码实现 题目链接&#xff1a;3609. Minimum Moves to Reach Target in Grid 1. 解题思路 这一题我一开始走岔了&#xff0c;走了一个正向遍历走法的思路&#xff0c;无论怎么剪枝都一直超时。后来看了…

工作流引擎:IDEA没有actiBPMN插件怎么办?

文章目录一、问题描述二、替代方案一、问题描述 我们在学习activiti7工作流引擎的时候&#xff0c;需要设计流程图。 一般推荐的就是使用IDEA插件actiBPMN进行开发。 但是&#xff0c;这个插件在IDEA2019后的版本都不在支持。 也就是搜不到 那么&#xff0c;怎么办了&#x…

Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目

一.CMake语法 CMake语法非常多&#xff0c;我们知道如何导入静态库和动态库以及最基础的使用&#xff0c;目前是够用的。其它方面则根据实际项目同步学习。 1.1.基础语法-常用 cmake_minimum_required&#xff1a;指定cmake最小版本include_directories&#xff1a;引入&#x…

React Native 初始化项目和模拟器运行

中文官方文档&#xff1a;https://reactnative.cn/docs/environment-setup 英文官方文档&#xff1a;https://reactnative.dev/docs/getting-started-without-a-framework#step-1-creating-a-new-application 创建新项目 1、初始化 # 如果你之前全局安装过旧的react-native-cli…

20250706-5-Docker 快速入门(上)-创建容器常用选项_笔记

一、创建容器常用选项&#xfeff;&#xfeff;1. 创建容器常用选项&#xfeff;1&#xff09;常用选项创建容器常用选项&#xfeff;交互式选项&#xff1a;-i&#xff1a;保持标准输入打开&#xff0c;允许交互式操作-t&#xff1a;分配伪终端&#xff0c;使容器像传统终端一…

插值与拟合(3):B样条曲线

在路径规划问题中&#xff0c;通常会用到B样条来平滑路径&#xff0c;本文实现并封装了三次准均匀开放B样条曲线&#xff0c;供大学学习使用。作者提供了三套代码方案。可以用于不同平台&#xff1a;方案1&#xff1a;MATLAB&#xff1b;方案2&#xff1a;标准C&#xff1b;方案…

[免费]基于Python豆瓣电影数据分析及可视化系统(Flask+echarts+pandas)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的于Python豆瓣电影数据分析及可视化系统(Flaskechartpandas)【论文源码SQL脚本】&#xff0c;分享下哈。项目介绍随着如今电影越来越多&#xff0c;各种各样的烂片和捞钱的商业片也层出不穷&#xff0c;而有意…

SQL127 月总刷题数和日均刷题数

SQL127 月总刷题数和日均刷题数 withtemp as (selectDATE_FORMAT(submit_time, "%Y%m") as submit_month,count(question_id) as month_q_cnt,round(count(question_id) / day(last_day(max(submit_time))),3) as avg_day_q_cntfrompractice_recordwhereyear(submit…

unity luban接入

1.找到luban官网并下载他的例子和.net8.0的sdk安装 官网地址如下 快速上手 | Luban 参考大佬教程如下 Luban新版本接入教程_哔哩哔哩_bilibili 2.找到他的luban_examples-main示例下的两个文件MiniTemplate和tool 3.MiniTemplate这个文件复制一份到项目工程下&#xff0c;自…

Django服务开发镜像构建

最后完整的项目目录结构1、安装依赖pip install django django-tables2 django-filter2、创建项目和主应用django-admin startproject configcd configpython manage.py startapp dynamic_models3、配置settings.py将项目模块dynamic_models加入进来&#xff0c;django_tables2…