【Nova UI】十二、打造組件庫之按鈕組件(上):邁向功能構建的關鍵一步

序言

在上一篇文章中,我們深入探索了 icon 組件從測試到全局注冊的全過程🎯,成功為其在項目中穩定運行筑牢了根基。此刻,組件庫的建設之旅仍在繼續,我們將目光聚焦于另一個關鍵組件 —— 按鈕組件。按鈕作為用戶與界面交互的核心紐帶🧐,其功能的完備性、樣式的美觀性以及操作的流暢性,都對用戶體驗起著至關重要的作用。接下來,讓我們一同深入剖析按鈕組件的實現過程,為組件庫增添強大助力,使其在前端開發的舞臺上綻放更加耀眼的光芒?。

UI

我們先借鑒 Element Plus 組件庫的樣式,著手實現一個基礎的按鈕組件。參考圖如下:

在這里插入圖片描述

從圖中可以分析出,該按鈕具備defaultprimarysuccessinfowarningdanger這幾種場景,它們的區別主要體現在邊框顏色、字體顏色以及背景顏色上。結合我們的實際業務需求,我們開始打造自己的按鈕組件

準備工作

按照慣例,我們首先在packages/components/button/src目錄下,新增button.tsbutton.vue文件📄。

props屬性

button.ts文件中,定義我們所需的props。這些屬性包括場景、大小、是否禁用、是否處于加載中、加載時的圖標、按鈕的前綴圖標、后綴圖標、按鈕形狀以及按鈕類型。

import { ExtractPropTypes, PropType } from 'vue'
import { useSceneProp, useSizeProp, useLoadingIconProp, useIconProp } from '@nova-ui/hooks'export const buttonShapes = ['round', 'circle'] as const
export type ButtonShapeType = typeof buttonShapes[number]export const buttonTypes = ['plain', 'text', 'link', 'dashed'] as const
export type ButtonTypeType = typeof buttonTypes[number]export const buttonProps = {scene: useSceneProp(),size: useSizeProp(),disabled: {type: Boolean,},loading: {type: Boolean,},loadingIcon: useLoadingIconProp(),prefixIcon: useIconProp(),suffixIcon: useIconProp(),shape: {type: String as PropType<ButtonShapeType>},type: {type: String as PropType<ButtonTypeType>}
} as constexport type ButtonType = ExtractPropTypes<typeof buttonProps>

相關代碼如上述所示。其中,scene場景屬性很可能在多個組件中復用,因此我們將其單獨提取出來(這是一個良好的編程習慣,當相同代碼在多處使用時,建議提取以提高代碼的可維護性)。在packages/constants目錄下新增scene.ts文件,用于存儲場景的常量及其類型。同時,在packages/hooks/use-scene目錄下新增index.ts文件,編寫我們需要使用的props屬性值。

// packages/constants/scene.ts
export const scenes = ['primary', 'success', 'warning', 'danger', 'error', 'info'] as const
export type Scene = typeof scenes[number]
// packages/hooks/use-scene/index.ts
import { PropType } from 'vue'
import { Scene } from '@nova-ui/constants'
export const useSceneProp = () => ({type: String as PropType<Scene>,
})

其它如sizeloadingIconprefixIconsuffixIcon等屬性的提取方式與之類似,在此不再一一贅述。

模板部分:構建按鈕的外觀與交互結構

首先來看看這段代碼的 HTML 模板部分,它決定了按鈕在頁面上的最終呈現效果,是按鈕組件的 “外觀設計師”👨?🎨。

<template><button:class="[ns.b(),ns.m(scene),ns.m(size),ns.is('disabled', disabled),ns.is('loading', loading),ns.is(!shape, !!shape),ns.is(!type, !!type),]"><template v-if="loading"><slot v-if="$slots.loading" name="loading"></slot><NIcon v-else :class="ns.e('loading')" :name="loadingIcon"></NIcon></template><template v-if="$slots.prefix || prefixIcon"><slot v-if="$slots.prefix" name="prefix"></slot><NIcon v-else-if="prefixIcon" :class="ns.e('prefix')" :name="prefixIcon"></NIcon></template><slot></slot><template v-if="$slots.suffix || suffixIcon"><slot v-if="$slots.suffix" name="suffix"></slot><NIcon v-else-if="suffixIcon" :class="ns.e('suffix')" :name="suffixIcon"></NIcon></template></button>
</template>

這段模板代碼定義了按鈕組件的可視化結構與交互元素。最外層的<button>標簽構建了按鈕的基本框架,通過:class綁定一系列動態類名,實現按鈕外觀的多樣化。

ns.b()提供了按鈕的基礎類名,是按鈕樣式的基石。ns.m(scene)ns.m(size)則根據傳入的scene(場景)和size(尺寸)參數,為按鈕添加相應的修飾類名,使按鈕能夠適配不同的使用場景與布局需求。

ns.is系列函數依據傳入的布爾值屬性,動態添加對應的狀態類名。例如,ns.is('disabled', disabled)disabledtrue時,為按鈕添加表示禁用狀態的類名,改變按鈕的外觀以提示用戶該按鈕當前不可操作。同理,ns.is('loading', loading)根據loading狀態添加或移除加載相關的類名,實現加載狀態下按鈕的視覺反饋。

在按鈕內容方面,代碼充分利用 Vue 的插槽機制與NIcon組件,實現了高度的靈活性。當按鈕處于loading狀態時,首先檢查是否存在名為loading的插槽。若有,則渲染該插槽內容,允許開發者自定義加載狀態下的顯示元素;若沒有,則渲染NIcon組件作為加載圖標,圖標類名由ns.e('loading')生成,圖標名稱則由loadingIcon屬性指定。

對于按鈕的前綴和后綴部分,同樣采用了靈活的判斷邏輯。先判斷是否存在prefix插槽,若有則渲染插槽內容;若沒有但設置了prefixIcon屬性,則渲染NIcon組件作為前綴圖標,類名由ns.e('prefix')生成,圖標名稱由prefixIcon指定。后綴部分的邏輯與之相同,通過這種方式,按鈕可以輕松添加各種圖標或自定義內容,極大地增強了按鈕的功能性與美觀性。

腳本部分:賦予組件功能與數據交互能力

腳本部分是按鈕組件的核心,負責引入必要的模塊、定義組件的配置與屬性,如同為組件注入靈魂🧠。

<script lang="ts" setup>import { useNamespace } from '@nova-ui/hooks'import { buttonProps, ButtonType } from './button'import { NIcon } from '@nova-ui/components'const ns = useNamespace('button')defineOptions({name: 'NButton',})defineProps(buttonProps)
</script>

useNamespace函數用于生成具有統一規范的類名,確保按鈕組件的樣式管理清晰且易于維護。buttonPropsButtonType./button文件引入,其中buttonProps定義了按鈕組件可接收的外部屬性,如disabledloadingsize等,為組件與外部的數據交互提供了接口。

NIcon組件從@nova-ui/components引入,用于在按鈕中顯示各種圖標。通過const ns = useNamespace('button')創建了按鈕組件專屬的樣式命名空間實例,供模板部分生成類名使用。

defineOptions({name: 'NButton'})為按鈕組件定義了名稱NButton,方便在 Vue 項目中進行識別與引用。defineProps(buttonProps)則依據buttonProps定義了組件可接收的屬性,將外部傳入的數據與組件內部邏輯連接起來,使組件能夠根據不同的屬性值呈現出相應的狀態與外觀。

綜上所述,這段代碼通過模板與腳本的協同工作,實現了一個功能豐富、可定制性強的 Vue 按鈕組件。它不僅能夠滿足各種常見的按鈕使用場景,還為開發者提供了靈活的擴展空間,在前端組件庫中具有重要的應用價值 。

🦀🦀感謝看官看到這里,如果覺得文章不錯的話🙌,點個關注不迷路?。
誠邀您加入我的微信技術交流群🎉,群里都是志同道合的開發者👨?💻,大家能一起交流分享摸魚🐟。期待與您在群里相見🚀,咱們攜手在開發路上共同進步? !
👉點我

感謝各位大俠一路相伴,實在感激! 不瞞您說,在下還有幾個開源項目 📦,它們就像精心培育的幼苗 🌱,急需您的澆灌。要是您瞧著還不錯,麻煩動動手指,給它們點亮幾顆 Star ?,您的支持就是它們成長的最大動力,在此謝過各位大俠啦!

  • Nova UI組件庫:https://github.com/gmingchen/nova-ui
  • 基于 Vue3 + Element-plus 管理后臺基礎功能框架
  • 預覽:https://admin.gumingchen.icu
    • Github:https://github.com/gmingchen/agile-admin
    • Gitee:https://gitee.com/shychen/agile-admin
    • 基礎版后端:https://github.com/gmingchen/java-spring-boot-admin
    • 文檔:http://admin.gumingchen.icu/doc/
  • 基于 Vue3 + Element-plus + websocket 即時聊天系統
    • 預覽:https://chatterbox.gumingchen.icu/
    • Github:https://github.com/gmingchen/chatterbox
    • Gitee:https://gitee.com/shychen/chatterbox
  • 基于 node 開發的后端服務:https://github.com/gmingchen/node-server

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78693.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙OSS文件(視頻/圖片)壓縮上傳組件-能夠增刪改查

一、鴻蒙實現處理-壓縮上傳整體代碼處理邏輯 轉沙箱壓縮獲取憑證并上傳文件 文件準備&#xff08;拿到文件流&#xff09;獲取上傳憑證&#xff08;調接口1拿到file_name和upload_url&#xff09;執行文件上傳&#xff08;向階段2拿到的upload_url上傳文件&#xff09;更新列表…

河道流量監測,雷達流量計賦能水安全智慧守護

在蜿蜒的河道之上&#xff0c;水流的脈搏始終與人類文明的興衰緊密相連。從農田灌溉的水量調配到城市防洪的精準預警&#xff0c;從生態保護的水質溯源到水資源管理的決策&#xff0c;河道流量監測如同大地的 “血管檢測”&#xff0c;是守護水安全的第一道防線。傳統監測手段在…

CSS3 基礎(邊框效果)

一、邊框效果 屬性功能示例值說明border-radius創建圓角border-radius: 20px;設置元素的圓角半徑&#xff0c;支持像素&#xff08;px&#xff09;或百分比&#xff08;%&#xff09;。值為 50% 時可變為圓形。box-shadow添加陰影box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.5)…

零基礎小白如何上岸數模國獎

零基礎小白如何上岸數模國獎 我自己本人第一次參加數模國賽順利上岸國獎&#xff0c;當然那段經歷也是比較痛苦了&#xff0c;差不多也是從當年四月開始接觸數學建模&#xff0c;第一次參加媽媽杯成績并不理想&#xff0c;后面不斷參加數模比賽進行模擬&#xff0c;最后順利上岸…

SQL學習-常用函數

常見SQL函數使用 &#xff08;注意&#xff1a;不同的數據庫類型使用的語法不同&#xff09; 以下是MySQL和PostgreSQL在實現替換、抽取、拼接、分列四個常見字符串操作功能時的核心區別總結&#xff0c;按功能分類對比&#xff1a; 1. 替換&#xff08;Replace&#xff09; …

rt-linux下的cgroup cpu的死鎖bug

一、背景 rt-linux系統有其非常大的實時性的優勢&#xff0c;但是與之俱來的是該系統上有一些天然的缺陷。由于rt-linux系統允許進程在內核態執行的邏輯里&#xff0c;在持鎖期間&#xff0c;甚至持spinlock鎖期間&#xff0c;都能被其他進程搶占。這一特性能帶來實時性的好處…

java—12 kafka

目錄 一、消息隊列的優缺點 二、常用MQ 1. Kafka 2. RocketMQ 3. RabbitMQ 4. ActiveMQ 5. ZeroMQ 6. MQ選型對比 適用場景——從公司基礎建設力量角度出發 適用場景——從業務場景角度出發 四、基本概念和操作 1. kafka常用術語 2. kafka常用指令 3. 單播消息&a…

14【模塊學習】74HC595:使用學習

74HC595 1、74HC595簡介2、代碼演示2.1、驅動8位流水燈 3、74HC595級聯3.1、驅動16位流水燈3.2、驅動8位數碼管3.3、驅動8x8點陣屏幕3.4、8x8點陣屏幕滾動顯示 1、74HC595簡介 在51單片機中IO引腳資源十分的緊缺&#xff0c;所以常常需要使用75HC595芯片進行驅動那些需要占用多…

JAVA后端開發常用的LINUX命令總結

一、Linux常用命令大全&#xff08;2025年最新版&#xff09; 常用 Linux 命令 文件和目錄管理&#xff1a; cd&#xff1a;用于切換當前工作目錄&#xff0c;如cd /home/user。mkdir&#xff1a;創建新目錄&#xff0c;mkdir -p /home/user/mydir可遞歸創建多級目錄。pwd&am…

uniapp-商城-40-shop 購物車 選好了 進行訂單確認4 配送方式3 地址編輯

前面說了配送 和地址頁面 當地址頁面為空或需要添加地址時&#xff0c;需要添加地址。 我的地址頁面有個按鈕 就是添加地址 點擊 添加地址 按鈕 后&#xff0c;就會跳轉到地址添加的頁面 1、添加地址頁面 2、添加地址文件夾以及文件的創建 3、添加地址的代碼 <template…

現場問題排查-postgresql某表索引損壞導致指定數據無法更新影響卷宗材料上傳

問題現象 今天突然被拉進一個群&#xff0c;說某地區友商推送編目結果報錯&#xff0c;在我們自己的卷宗系統上傳材料也一直轉圈&#xff0c;也刪除不了案件卷宗&#xff0c;重置模板也沒用&#xff0c;只有個別案件有問題。雖然這事兒不屬于我負責&#xff0c;但還是抽時間給…

Redis01-基礎-入門

零、文章目錄 Redis01-基礎-入門 1、認識 NoSQL NoSQL 知識請參考&#xff1a;https://blog.csdn.net/liyou123456789/article/details/132612444 2、認識 Redis &#xff08;1&#xff09;簡介 Redis&#xff08;Remote Dictionary Server&#xff0c;遠程字典服務&…

【嘉立創EDA】如何在更新或轉換原理圖到PCB時,保留已有布局器件

文章路標?? :one: 文章解決問題:two: 主題內容:three: 參考方法be end..1?? 文章解決問題 操作環境:嘉立創EDA專業版 V2.2.37 本文使用嘉立創EDA,描述在更新或轉換原理圖到PCB時,保留已有布局器件的方法。本文將此過程記錄,以供有需要的讀者參考。 2?? 主題內容 …

03 APQC PROCESS CLASSIFICATION FRAMEWORK (PCF)

APQC流程分類框架&#xff08;APQC Process Classification Framework, PCF&#xff09;最初由美國生產力與質量中心&#xff08;American Productivity & Quality Center, APQC&#xff09;開發&#xff0c;旨在用于跨組織的流程性能基準比較。現在&#xff0c;它也常被用…

分析型數據庫入門指南:如何選擇適合你的實時分析工具?

一、什么是分析型數據庫&#xff1f;為什么需要它&#xff1f; 據Gartner最新報告顯示&#xff0c;超過75%的企業現已在關鍵業務部門部署了專門的分析型數據庫&#xff0c;這一比例還在持續增長。 隨著數據量呈指數級增長&#xff0c;傳統數據庫已無法滿足復雜分析場景的需求…

body Param Query 三個 不同的入參 分別是什么意思 在前端 要怎么傳 這三種不同的參數

在 NestJS 中&#xff0c;Body()、Param() 和 Query() 用于處理不同類型的請求參數。以下是它們的含義及前端傳遞方式&#xff1a; Body()&#xff1a;請求體參數 ? 含義&#xff1a;用于獲取請求體中的數據&#xff08;如 POST/PUT 請求中提交的 JSON、表單數據等&#xff09…

神經網絡(自己記錄)

一、神經網絡基礎 5分鐘-通俗易懂 - 神經網絡 反向傳播算法&#xff08;手算&#xff09;_嗶哩嗶哩_bilibili 二、GAT

Redis Slot 槽位分片具體案例

?鍵值槽位分配案例? 當執行 SET {kaigejava}k1 v1 時&#xff0c;Redis 會提取 {} 內的有效部分 kaigejava&#xff0c;通過 CRC16 算法計算哈希值&#xff0c;再對 16384 取余得到槽位。例如&#xff1a; 若計算結果為 1495&#xff0c;則該鍵會被分配到槽位 1495 對應的節…

【多模態模型】跨模態智能的核心技術與應用實踐

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現&#xff08;CLIP圖像-文本檢索&#xff09;運行結果驗證 三、性能對比測試方法論量化數據對比結果…

final static 中是什么final static聯合使用呢

final static 聯合使用詳解 final 和 static 在 Java 中經常一起使用&#xff0c;主要用來定義類級別的常量。這種組合具有兩者的特性&#xff1a; 基本用法 public class Constants {// 典型的 final static 常量定義public static final double PI 3.141592653589793;pub…