【封装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

手机摄影新宠:In-line Hardware EIS如何让你的4K视频稳如鸡头(附实测对比)

本文深入解析了手机摄影中的In-line Hardware EIS(硬件级行内电子图像稳定)技术。通过对比传统软件EIS,阐述了其通过硬件管道实时处理实现极低延迟、减少画面裁切和有效抑制果冻效应的核心优势,并结合4K视频的日夜间实测,展示了该技术如何让手持拍摄的视频“稳如鸡头”,显著提升创作体验与成片质量。

tree的博客 995

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

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

沸羊羊_ 8078

STA 静态时序分析 第三章——标准单元库中的高级功耗建模与优化策略

本文深入探讨了STA静态时序分析中标准单元库的高级功耗建模与优化策略。详细解析了动态功耗和漏电功耗的精细建模技术,包括基于波形敏感的CCS模型和温度敏感的漏电模型,并介绍了多工艺角功耗建模及低功耗设计优化策略,为纳米级芯片设计提供关键能效解决方案。

weixin_29290863的博客 224

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

封装组件库

a2274001782的博客 4248

ESP32编译卡在‘Cannot establish a connection to the component registry’?别急着重装,先试试这两个国内镜像配置

本文详细解析了ESP32编译过程中常见的‘Cannot establish a connection to the component registry’报错问题,并提供了国内镜像源的配置方案。通过对比Gitee、清华大学、阿里云和中科大等镜像源的性能,帮助开发者快速解决网络连接问题,提升编译效率。文章还包含手把手的配置教程和进阶技巧,适用于ESP-IDF开发环境的优化。

weixin_34088048的博客 341

大华摄像头GB28181协议接入EasyCVR全流程(附常见错误排查)

本文详细阐述了大华摄像头通过GB28181协议接入EasyCVR视频管理平台的全流程,涵盖从核心原理、前期参数规划、Web界面配置到平台侧验证的完整步骤。重点针对网络端口、SIP参数配置等关键环节提供了深度排错指南,并总结了设备无法注册、在线不稳定、拉流失败等常见问题的排查思路与解决方案,旨在帮助安防工程师与系统集成商高效完成设备接入与调试。

weixin_29279153的博客 310

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

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

weixin_51670675的博客 4813

Unity Hololens2开发|(一)环境配置

开发过程中预览和调试应用:可以在电脑上的 Unity 编辑器中以播放模式本地运行应用,并将体验流式传输到 HoloLens2。将来自 HoloLens2 的输入(视线、手势、语音和空间映射)发送到电脑,在其中内容以虚拟沉浸式视图渲染。在HoloLens2设备中,打开Settings面板,依次选择Update & Security > For Developers,打开“Developer Mode”。在开发计算机中打开控制面板,依次选择“更新和安全> 开发者选项”,打开“开发人员模式”;

游戏开发小Y的博客 14万+

React Native第三方组件库汇总

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

2401_86367029的博客 3639

【fpdlink显示】DS90UB948关于941连接948 GPIO调试问题

1. 前言 使用一个941连接2 948显示: 941的GPIO0/1/2/3到前948的GPIO0/1/2/3和941的D_GPIO0/1/2/3到948的GPIO0/1/2/3。 设置gpio3输出,则941的D_GPIO3设置高,而948的gpio3设置不高; 但设置gpio3输入后,看到941的D_GPIO3跟随948的gpio3变化。 2. 原理图连接 3. 测试代码 static int du90ub941_enable_port(struct goodix_ts_d

jzwjzw19900922的博客 2556

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1196

Vue封装组件库-button组件

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

二木成林 2644

渗透测试工具之Sliver

攻击者需要将生成的植入物传输到目标系统,并执行它。C2 框架的架构与 Metasploit(如 Meterpreter)类似,但更专注于。(Red Teaming)中常见的攻击工具之一,攻击者利用 C2 服务器。组成,二者共同实现 C2 服务器与受控设备的通信。植入物(Implants)是 Sliver 生成的。抓包分析时,可以看到所有数据都是加密传输的。和**监听器(Listeners)**功能。Sliver 支持多种通信协议,如。随着安全防御的不断提升,企业应加强。进行通信,数据仍然是加密的。

idlecloud0105的博客 1936

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

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

weixin_41432139的博客 3161

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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、付费专栏及课程。

余额充值