【封装UI组件库系列】封装Button图标组件

如何封装自定义的UI组件(实际项目开发) 如何在实际开发中封装自定义的UI组件。 阅读详情

封装UI组件库系列第四篇·封装Button按钮组件

🌟前言

🌟封装Button组件

1.分析封装组件所需支持的属性与事件

支持的属性:

支持的事件:

2.创建Button组件

🌟封装功能属性

type主题颜色

plain是否朴素

loading等待状态

其他属性 

 🌟总结


🌟前言

在前端开发中,大家可能已经用过各种各样的UI组件库了,现在市面上热门的有Element-ui、Ant Design等等,这些即插即用的组件库确实大大提升了开发效率,避免了很多的重复劳动,但这些组件库再怎么完善,又怎么能满足得了我们可爱的产品经理呢?所以工作中难免会需要开发公司内部的UI组件库,或者基于已有组件库进行二开。

【封装UI组件库系列】文章,将从0开始--》搭建项目--》封装八大经典功能组件--》打包组件库--》将组件库发布至npm--》使用自己封装的组件库。技术方面使用的是Vue3 + Vite + Sass 来完成一个模仿Element Plus的组件库。最终完成效果如下:

【封装UI组件库系列】建议从开篇开始阅读!!!icon-default.png?t=N7T8https://blog.youkuaiyun.com/g_ing/category_12503768.html?spm=1001.2014.3001.5482

🌟封装Button组件

上一篇我们已经封装了第一个Icon组件,接下来我们就开始封装Button组件

1.分析封装组件所需支持的属性与事件

在开始敲代码前,我们需要先有个思路,要开发什么,需要什么功能,先定好,再动手:

支持的属性:

属性名作用类型是否必须默认值
type主题颜色String否default
size大小String否无
plain是否朴素Boolean否false
round是否圆角Boolean否false
circle是否圆形Boolean否false
disabled是否禁用Boolean否false
loading是否加载中Boolean否false
icon图标String否无

支持的事件:

事件名作用
click点击事件

 确定好要做的事情,就可以开干喽。

2.创建Button组件

创建组件Button.vue:

 在main.js中引入注册:

在views/Button.vue中使用:

🌟封装功能属性

老规矩,新建src/components/Button/props.js  文件义属性:

type主题颜色

在props.js:

export default {
  type: {
    type: String,
    default: 'default'
  },
}

新建style/components/icon.scss 

完善基本样式,其实这里很多用到的就是第二篇文章中定义的样式(具体代码文末):

接下来就是实现主题颜色:

 前面文章也将过的,这里还是使用scss语法:

 然后在组件中去判断有没有type,有的话就挂上对应样式类:

效果如下: 

plain是否朴素

同理,定义样式:

定义props: 

判断条件:

loading等待状态

这里需要用到上节课封装的Icon组件:

 使用:

效果:

其他属性 

讲过上面几种后其他的大差不差,直接上代码

/components/Button/Button.vue:

<template>
    <button ref="_ref" class="visual-button" :class="{
        [`visual-button--${type}`]: type,
        [`visual-button--${size}`]: size,
        'is-plain': plain,
        'is-round': round,
        'is-circle': circle,
        'is-disabled': disabled || loading
    }">
    <Visual-Icon icon="spinner" spin v-if="loading" />
    <Visual-Icon :icon="icon" v-if="icon" />
    <span v-if="$slots.default">
      <slot />
    </span>
    </button>
</template>

<script setup>
    import propObj from './props'
    defineOptions({
        name: 'visual-Button'
    })
    defineProps(propObj)
</script>
<style lang="scss" scoped></style>

 /components/Button/props.js:

export default {
  type: {
    type: String,
    default: 'default'
  },
  plain: {
    type: Boolean,
    default: false
  },
  round: {
    type: Boolean,
    default: false
  },
  disabled: {
    type: Boolean,
    default: false
  },
  loading: {
    type: Boolean,
    default: false
  },
  icon: {
    type: String
  },
  size: {
    type: String
  },
  circle: {
    type: Boolean,
    default: false
  }
}

styles/components/button.scss:

// 首先针对这个样式类里面,定义了一系列的样式变量
.visual-button {
  --visual-button-font-weight: var(--visual-font-weight-primary);
  --visual-button-border-color: var(--visual-border-color);
  --visual-button-bg-color: var(--visual-fill-color-blank);
  --visual-button-text-color: var(--visual-text-color-regular);
  --visual-button-disabled-text-color: var(--visual-disabled-text-color);
  --visual-button-disabled-bg-color: var(--visual-fill-color-blank);
  --visual-button-disabled-border-color: var(--visual-border-color-light);
  --visual-button-hover-text-color: var(--visual-color-primary);
  --visual-button-hover-bg-color: var(--visual-color-primary-light-9);
  --visual-button-hover-border-color: var(--visual-color-primary-light-7);
  --visual-button-active-text-color: var(--visual-button-hover-text-color);
  --visual-button-active-border-color: var(--visual-color-primary);
  --visual-button-active-bg-color: var(--visual-button-hover-bg-color);
  --visual-button-outline-color: var(--visual-color-primary-light-5);
  --visual-button-active-color: var(--visual-text-color-primary);
}

.visual-button {
  // 接下来再来书写基本的样式
  display: inline-block;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  height: 40px;
  background-color: var(--visual-button-bg-color);
  border: var(--visual-border);
  border-color: var(--visual-button-border-color);
  color: var(--visual-button-text-color);
  appearance: none;
  text-align: center;
  box-sizing: border-box;
  outline: none;
  margin: 0;
  transition: 0.1s;
  font-weight: var(--visual-button-font-weight);
  user-select: none;
  vertical-align: middle;
  padding: 12px 20px;
  font-size: var(--visual-font-size-base);
  border-radius: var(--visual-border-radius-base);
  &:hover,
  &:focus {
    color: var(--visual-button-hover-text-color);
    border-color: var(--visual-button-hover-border-color);
    background-color: var(--visual-button-hover-bg-color);
    outline: none;
  }
  &:active {
    color: var(--visual-button-active-text-color);
    border-color: var(--visual-button-active-border-color);
    background-color: var(--visual-button-active-bg-color);
    outline: none;
  }
  &.is-round {
    border-radius: var(--visual-border-radius-round);
  }
  &.is-circle {
    width: 45px;
    height: 45px;
    border-radius: 50%;
    padding: 12px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
  // 禁用相关的样式
  &.is-disabled,
  &.is-disabled:hover,
  &.is-disabled:focus,
  &[disabled],
  &[disabled]:hover,
  &[disabled]:focus {
    color: var(--visual-button-disabled-text-color);
    cursor: not-allowed;
    background-image: none;
    background-color: var(--visual-button-disabled-bg-color);
    border-color: var(--visual-button-disabled-border-color);
  }
  [class*='visual-icon'] + span {
    margin-left: 6px;
    position: relative;
    bottom: 2px;
  }
}

@each $val in primary, success, warning, info, danger {
  // 这是一种非常灵活的方式,通过挂上去一些类,改变 CSS 变量所对应的值
  .visual-button--#{$val} {
    --visual-button-text-color: var(--visual-color-white);
    --visual-button-bg-color: var(--visual-color-#{$val});
    --visual-button-border-color: var(--visual-color-#{$val});
    --visual-button-outline-color: var(--visual-color-#{$val}-light-5);
    --visual-button-active-color: var(--visual-color-#{$val}-dark-2);
    --visual-button-hover-text-color: var(--visual-color-white);
    --visual-button-hover-bg-color: var(--visual-color-#{$val}-light-3);
    --visual-button-hover-border-color: var(--visual-color-#{$val}-light-3);
    --visual-button-active-bg-color: var(--visual-color-#{$val}-dark-2);
    --visual-button-active-border-color: var(--visual-color-#{$val}-dark-2);
    --visual-button-disabled-text-color: var(--visual-color-white);
    --visual-button-disabled-bg-color: var(--visual-color-#{$val}-light-5);
    --visual-button-disabled-border-color: var(--visual-color-#{$val}-light-5);
  }
  // 如果挂了 is-plain 这个,那么同样是改变一些 CSS 变量的值
  .visual-button--#{$val}.is-plain {
    --visual-button-text-color: var(--visual-color-#{$val});
    --visual-button-bg-color: var(--visual-color-#{$val}-light-9);
    --visual-button-border-color: var(--visual-color-#{$val}-light-5);
    --visual-button-hover-text-color: var(--visual-color-white);
    --visual-button-hover-bg-color: var(--visual-color-#{$val});
    --visual-button-hover-border-color: var(--visual-color-#{$val});
    --visual-button-active-text-color: var(--visual-color-white);
  }
}

// 针对 visual-button-large 以及 visual-button-small 书写相应的样式即可
.visual-button--large {
  --visual-button-size: 50px;
  height: var(--visual-button-size);
  padding: 12px 19px;
  font-size: var(--visual-font-size-base);
  border-radius: var(--visual-border-radius-base);
}
.visual-button--small {
  --visual-button-size: 24px;
  height: var(--visual-button-size);
  padding: 5px 11px;
  font-size: 12px;
  border-radius: calc(var(--visual-border-radius-base) - 1px);
}

 🌟总结

 【封装UI组件库系列】文章会持续更新,将带着大家从0开始--》搭建项目--》封装八大经典功能组件--》打包组件库--》将组件库发布至npm--》最后使用自己封装的组件库。如果文中出现有瑕疵的地方各位通过评论或者私信联系我,我们一起进步!该系列文章建议从第一篇开始看,系列专栏地址:从零开始封装UI组件库完整篇

react antd 按钮重新封装 按钮组件: import { Button } from 'antd'; import * as React from 'react'; import PropTypes from 'prop-types'; const BaseBtn = ({ children, onClick, bcolor, color, bgColor, full }) => { // const btnClassName = classnames({ // [`new_btn_${bcolor}`]:.. 阅读详情

相关推荐

vue3 ui二次封装可封装哪些组件

通过封装。

leijmdas的专栏 792

antd组件库封装52-升级button样式2

前端

qq_41632427的博客 160

Uniapp UI 组件库实战指南:从入门到精通

本文是一份全面的Uniapp UI组件库实战指南,详细介绍了从零开始认知组件库的必要性、主流库(如uView UI、uni-ui)的选型对比,到手把手的环境搭建与核心组件应用。通过构建表单页、个人中心等实战案例,深入讲解了基础与高级组件的使用,并涵盖主题定制、性能优化等进阶技巧,旨在帮助开发者高效构建美观、一致且高性能的多端应用。

weixin_29022115的博客 439

vue3 对ant-design-vue 按钮组件进行二次封装

我们要实现的需求,在表格action栏,按钮以图标形式展示,移动到图标上有对应的按钮操作提示。 因为页面复用的比较多,所以对图标根据业务需求进行了二次封装 组件代码结构如下 index的内容: <template> <!-- 新增 --> <template v-if="type==='add'"> <a-tooltip :title="text" color="#87d068"> <a-button shape="ci.

圆圈圈的博客 2014

工程化:vite3+vue3二次封装antdvue组件方法

有时候,第三方的组件库不能满足我们的业务需求,就有必要对别人的组件进行再次的封装,下面我们以antdvue里面的button组件二次封装为例,研究下封装的过程

峰会路转的博客 897

AAAI 2025杰出论文解读:神经符号推理与生物多样性计算的突破性进展

本文深度解读了AAAI 2025两篇杰出论文的突破性进展。南京大学周志华团队提出“溯因反射”框架,高效解决神经符号推理中的“不一致性”核心难题,为构建可靠、可解释的AI系统提供了新路径。斯坦福大学等机构的DiVShift研究,则系统分析了公民科学数据中的复杂分布偏移,为利用海量数据精准监测生物多样性及应对AI数据偏差提供了关键方法论。

weixin_29085865的博客 501

「从0到1搭建自己的UI组件库」-- button组件

带你封装属于自己的组件库!

沸羊羊_ 8078

Dify插件实战:实时渲染AI生成的HTML/SVG/Canvas代码

在现代Web开发与AI应用集成中,前端渲染技术是实现动态内容展示的核心。其原理在于浏览器引擎解析HTML、CSS、JavaScript等代码,并将其转换为可视化的用户界面。这项技术的价值在于极大提升了开发效率与用户体验,允许开发者快速构建和迭代交互式应用。在AI应用开发领域,尤其是大语言模型(LLM)集成场景,如何将模型生成的**结构化代码**(如描述UI的HTML或数据图表的SVG)实时转化为可视化组件,成为一个关键需求。这直接关系到**Dify**等低代码AI平台能否提供流畅的、所见即所得的交互体验。本

weixin_42545664的博客 499

vue封装自己的组件库 01.封装button组件

封装组件库

a2274001782的博客 4248

MiFlash Prime免授权刷机实战:解锁小米9008 EDL救砖新方案

MiFlash Prime作为免授权刷机工具,有效解决了小米设备在9008 EDL模式下因账号验证无法救砖的难题。本文详细介绍了从驱动安装、进入EDL模式到固件刷写的完整流程,帮助用户安全快速地恢复变砖设备,是维修人员和极客的实用解决方案。

5f4d3s2a1q的博客 2880

MSP430开发入门:手把手教你用IAR EW430从建工程到烧录调试(附F5529配置)

本文详细介绍了如何使用IAR Embedded Workbench(EW430)进行MSP430F5529开发板的嵌入式开发,从环境搭建、工程配置到硬件调试全流程。通过实战示例和关键配置技巧,帮助开发者快速掌握MSP430开发的核心要点,包括LED控制、定时器使用和低功耗优化等实用技术。

weixin_30240349的博客 392

组件库系列一:搭建自己的组件库

组件库系列文章,从头搭建组件库,发布组件库文档并上传npm。分享组件搭建的思路和遇到的坑。

weixin_51670675的博客 4813

12-RK平台U-Boot启动流程

先看概述,把这一章要回答的问题摆出来,带着问题听。RK 特有的 BootROM -> MiniLoader -> SPL -> U-Boot -> Kernel。这是因为 RK 平台使用闭源的 DDR 初始化固件,需要通过 MiniLoader 来加载和运行。为什么多一层?这是 RK 平台的特殊性决定的。RK 平台使用闭源的 DDR 初始化固件,这段代码 Rockchip 不开源,只能以二进制形式提供,它需要一个载体来加载和运行,这个载体就是 MiniLoader。

内核笔记 1147

React Native第三方组件库汇总

小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。

2401_86367029的博客 3639

用 Claude Code 快速摸清一个陌生代码库

摘要:Claude Code作为AI编码助手,能帮助开发者快速理解陌生代码库。与传统代码搜索不同,它从项目根目录出发,通过分析目录结构、配置文件等技术栈信息,提供系统级的概览。最佳实践是先通过"give me an overview"获取整体架构,再深入数据模型、认证流程等核心模块。它能生成术语表、编码规范和推荐的代码阅读路径,极大降低新成员的学习成本。相比传统方式,Claude Code能主动探索项目上下文,无需人工整理相关文件,使代码理解过程更接近有经验的工程师带教。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 93

一文吃透 SAP HANA Service Broker:原理、架构与落地实践

摘要:SAP HANA Service Broker 作为云原生开发的关键组件,通过标准化流程管理 HDI 容器与服务实例的生命周期,实现数据库资源的自动化配置与安全隔离。它采用服务目录、服务计划和绑定机制,将连接凭据注入应用环境变量,避免硬编码风险。在实际应用中,需根据模块生命周期决定共享或隔离容器,并通过跨容器访问模式实现安全数据共享。典型案例展示了电商平台的多模块协同与SaaS租户隔离场景,验证了其在提升运维效率与安全合规方面的价值。最佳实践强调以生命周期划边界、最小权限原则和HTTPS安全传输,为企

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

Vue封装组件库-button组件

常见组件封装 使用vue create green-ui命令初始化一个vue项目 勾选如下 选择scss 选择eslint风格 选择保存时校验 选择In package.json 保存 输入项目名 创建项目成功 启动项目 然后把App.vue修改为如下内容 <template> <div id="app"> 定制组件 </div> </template> <script&

二木成林 2644

Unreal5从入门到精通之如何解决在VR项目在头显中卡顿的问题

以前我们使用Unity开发VR,Unity提供了非常便利的插件和工具来做VR。但是由于Unity的渲染效果不如Unreal,现在我们改用Unreal来做VR了,所有的VR相关的配置和操作都要重新学习。今天就来总结一下,我在开发VR过程中碰到的所有问题。好了,以上就是我目前做VR时碰到的一些问题,希望对你有所帮助。

TxNet 2482

基于element-ui的vue组件的封装(一)

基于element-ui的vue组件的封装

weixin_41432139的博客 3161

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Vue学习之旅Part18:Vue组件库Mint UI的介绍及使用(结合Webpack)

一、简介 Mint UI是一个基于Vue.js的移动端组件库 若对组件的概念不太了解 请参看本人的另一篇博客:Vue学习之旅Part8:Vue全局组件和私有组件的创建及组件切换动画 Mint UI和Bootstrap不一样 Bootstrap并不是一个真正的组件库 而是类似于代码片段 而Mint-UI是真正的组件库 是使用 Vue 技术封装的成套组件 可无缝和VUE项目进行集成开发 且只适用于Vu...

"✧treasure mountain✧" 3789

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Vue进阶-从0到1搭建UI组件库

基本介绍 课程介绍 做什么? Vue进阶-从0到1搭建UI组件库 哪些内容? 封装常见的功能性组件(Button、Modal、Form相关) 把组件封装成UI组件库并且发布到NPM上 涉及知识点 vue基础语法 组件基本语法 组件通讯(sync,provide,inject) 插槽的使用 props校验 过渡与动画处理 计算属性与监听属性 v-model语法糖 vue插件机制 npm发布 课程收货 掌握组件封装的语法和技巧 学会造轮子,了解element-ui组件库的实现原理 搭建和积

good god~的博客 995

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Planck.js 安装与快速上手:NPM、CDN 与 Testbed 完整指南

> **导读**:Planck.js 是一款基于 TypeScript 编写的 2D 刚体物理引擎(Box2D 的 JavaScript/TypeScript 重写版),可用于跨平台 HTML5 游戏开发。本文以官方安装文档为主线,系统讲解通过 NPM 与 CDN 两种途径安装核心库与 Testbed 调试工具的方法,并补充模块引入细节、包分发结构、Hello World 验证流程及从源码本地运行

gitblog_00445的博客 827

Pillar Valley游戏UI组件库:自定义React Native组件的完整实现

Pillar Valley是一款使用Expo和three.js构建的跨平台视频游戏,其UI组件库为游戏提供了一致且引人入胜的用户界面体验。本文将深入探讨Pillar Valley游戏中自定义React Native组件的实现方式,帮助开发者了解如何构建适用于游戏的高质量UI组件。 ## 组件库架构概览 Pillar Valley的UI组件库采用模块化设计,将不同功能的组件分类存放,便于维护和扩

gitblog_00656的博客 1027

自定义组件库

自定义组件库的封装

qq_62428300的博客 486

高仿Element.ui搭建属于自己的ui组件库(1)

新建vue脚手架项目 Element.ui内部使用的css预编译为scss,所以我们选择dart-scss即可,其余正常创建; 剃干净初始化的项目,什么helloworld组件统统清理掉 /components下新建button.vue文件,作为我们第一个尝试的button组件 main.js中导入该组件并注册为全局组件 import Vue from 'vue' import App from './App.vue' import HButton from './components/button'

lwl12345678_的博客 1244

React-Hook 轮子公开课(从零开始)用最基础的方式写出一个简单的组件库——第二课【Button】组件

有兴趣的同学 可以先着手看源码,之前写的一系列开源组件库项目(有帮助的同学也帮忙点个star👍)提到 button 组件,这几乎可以说是一个组件库中的重中之重,基本上很多的时候我们都需要用到 button 来进行一系列的 dom 操作,时间执行,用户与浏览器之间进行交互不免得就少不了 button 按钮,那么我们先捋清楚一个思路这个 button 该怎么去写? 3.2、index.scss 3.3、variables.scss(这里的文本样式是参考的 bin-ui ) 四、效果呈现 至此效果实现当然.

韩旭的博客 769
上一篇: 【封装UI组件库系列】封装Icon图标组件
下一篇: JavaScript值和引用
琢鸣
琢鸣 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄7年 9626粉丝 53原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琢鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值