如何設計一個“真正可復用”的前端組件?

🧱 如何設計一個“真正可復用”的前端組件?

🔧 一個按鈕可以寫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…