【封装UI组件库系列】封装Button图标组件
封装UI组件库系列第四篇·封装Button按钮组件
🌟前言
🌟封装Button组件
1.分析封装组件所需支持的属性与事件
支持的属性:
支持的事件:
2.创建Button组件
🌟封装功能属性
type主题颜色
plain是否朴素
loading等待状态
其他属性
🌟总结
🌟前言
在前端开发中,大家可能已经用过各种各样的UI组件库了,现在市面上热门的有Element-ui、Ant Design等等,这些即插即用的组件库确实大大提升了开发效率,避免了很多的重复劳动,但这些组件库再怎么完善,又怎么能满足得了我们可爱的产品经理呢?所以工作中难免会需要开发公司内部的UI组件库,或者基于已有组件库进行二开。
【封装UI组件库系列】文章,将从0开始--》搭建项目--》封装八大经典功能组件--》打包组件库--》将组件库发布至npm--》使用自己封装的组件库。技术方面使用的是Vue3 + Vite + Sass 来完成一个模仿Element Plus的组件库。最终完成效果如下:
【封装UI组件库系列】建议从开篇开始阅读!!!https://blog.csdn.net/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组件库完整篇
相关文章:

【封装UI组件库系列】封装Button图标组件
封装UI组件库系列第四篇封装Button按钮组件 🌟前言 🌟封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性: 支持的事件: 2.创建Button组件 🌟封装功能属性 type主题颜色 plain是否朴素 loading等…...

windows系统mobaxterm远程执行linux上ssh命令
命令如下 start "" "%~dp0\MobaXterm_Personal_23.4.exe" -newtab "sshpass -p root ssh root192.168.11.92 mkdir 33" -p 是密码 左边是用户名,右边是服务器ip 后面跟的是服务器上执行的命令 第一次执行的时候要设置mobaxt…...

debian 12 配置
1. 修改apt源 修改apt源为http版本 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/d…...

AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程
一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…...
Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器
Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js Axios官方中文文档 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支…...

git提交报错error: failed to push some refs to ‘git url‘
1.产生错误原因 想把本地仓库提交到远程仓库,报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因: 我们在创建仓库的时候,都会勾选“使用Reamdme文件初始化…...
【Python】(自定义函数)模块的相对路径导入
是我以前写的老文章的升级版,本质上使用exec和sys.path实现相对路径导入。 RelativeImport: __version__1.1.0 __author__Ls_Janimport os import sys import inspectdef RelativeImport(module,*args):#模块导入module为模块所在路径(模块名不需要.py后…...

巧妙之中见真章:深入解析常用的创建型设计模式
设计模式之创建型设计模式详解 一、设计模式是什么?二、模板方法2.1、代码结构2.2、符合的设计原则2.3、如何扩展代码2.4、小结 三、观察者模式3.1、代码结构3.2、符合的设计原则3.3、如何扩展代码3.4、小结 四、策略模式4.1、代码结构4.2、符合的设计原则4.3、如何…...

Selenium切换窗口、框架和弹出框window、ifame、alert
一、切换窗口 #获取打开的多个窗口句柄 windows driver.window_handles #切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) #最大化浏览器 driver.maximize_window() #刷新当前页面 driver.refresh() 二、切换框架frame 如存在以下网页: <htm…...

QT linux下应用程序打包
一、应用程序app 1、应用程序的pro文件 2、 程序工作函数 3、app的UI界面 二、动态库lib 1、Lib类头文件 2、.cpp文件 三、对应用程序和动态库进行构建 1、对动态库进行qmake,然后进行构建 2、对应用程序进行qmake,然后进行构建 3、查看构建目录 四、编写脚本 …...

Java高级技术(单元测试)
一,概括 二,junit 三,案例 (1),实验类 package com.bilibili;public class Name {public static void main(String name) {if (name null){System.out.println("0");return;}System.out.print…...

leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解
给你二叉树的根节点 root 和一个整数 limit ,请你同时删除树中所有 不足节点 ,并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为 不足节点 ,需要被删除…...

C++基础 -10- 类
类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};...

【软件测试】性能测试相关指标
性能测试 了解性能测试相关指标 1.什么是做性能测试 1.1 生活中遇到的软件性能问题 软件用着用着就不能用了,一看热搜,发现该软件的服务器崩崩溃了。 1.2 性能测试定义 测试人员借助性能测试工具,模拟系统在不同场景下,对应…...
Leetcode 2943. Maximize Area of Square Hole in Grid
Leetcode 2943. Maximize Area of Square Hole in Grid 1. 解题思路2. 代码实现 题目链接:2943. Maximize Area of Square Hole in Grid 1. 解题思路 这一题的话其实横轴和竖轴可以分开来独立考察,因为两者互不影响,我们最终的答案一定是两…...
qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
QHBoxLayout水平布局,QVBoxLayout垂直布局,QFormLayout表单布局管理器,是常用的布局管理器,是用代码编写应用界面必不可少的功能类. 1.tips 这里值得注意的是,2个单选按钮(QRadioButton)同时放进一个水平布局管理器(QHBoxLayout)中,相当于放进了一个分组器中,此时,2个单选按钮…...

springboot中4级配置文件优先级
springboot中4级配置文件优先级...

Python(八十九)函数的参数的内存分析
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...

西南科技大学C++程序设计实验二(类与对象一)
C++最大的特点就是面向对象,掌握它的几种基本性质还是好理解的,可以看我C++专栏的期末速成,希望对你们学习C++有帮助。 一、实验目的 1.理解简单类的定义、说明与使用 2.理解类中不同属性数据成员的访问特点 3.理解构造函数、析构函数的作用 重点:掌握类的定义与实现,…...
代码随想录二刷 |哈希表 |四数之和
代码随想录二刷 |哈希表 |四数之和 题目描述解题思路 & 代码实现 题目描述 18.四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nu…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...