07- Vue3 UI Framework - Switch 组件
为了更好的提升用户体验,我们这里再做一个很常用的开关组件
switch返回阅读列表点击 这里
需求分析
开始之前我们先做一个简单的需求分析
switch组件应分为选中/未被选中,两种状态- 可以通过点击变更选中状态
- 不同的选中状态有不同的颜色,且有滑块处于不同的端
- 可以指定不同的尺寸
- 可以自定义颜色
- 可以设置为禁用
那么可以整理出以下参数表格
| 参数 | 含义 | 类型 | 可选值 | 默认值 |
|---|---|---|---|---|
| value | 默认选择状态 | boolean | false / true | false |
| size | 尺寸 | string | middle / small / large | middle |
| color | 颜色 | string | 任意合法颜色值 | #8c6fef |
| disabled | 是否禁用 | boolean | false / true | false |
骨架
这里我们可以参考 button 组件,因为 switch 组件具有和 button 组件一样的”点击”之功能,所以这里可以直接使用 button 标签来实现,然后再用一个 div 来充当滑块,很容易得到如下骨架:
<template>
<button
@click="toggle"
class="jeremy-swicth"
:class="{ active: value }"
:size="size"
:style="{ '--color': color }"
:disabled="disabled"
>
<div></div>
</button>
</template>
功能
首先,我们再 Typescript 中声明一些需求分析中的属性:
declare const props: {
value: boolean;
size?: "middle" | "small" | "large";
color: string;
disabled: boolean;
};
declare const context: SetupContext;
然后,再在 export default 中写入声明的参数:
export default {
install: function (Vue) {
Vue.component(this.name, this);
},
name: "JeremySwitch",
props: {
value: {
type: Boolean,
default: false,
},
size: {
type: String,
default: "middle",
},
color: {
type: String,
default: "#8c6fef",
},
disabled: {
type: Boolean,
default: false,
},
},
};
最后,再补全 setup 方法:
setup(props, context) {
const toggle = () => {
context.emit("update:value", !props.value);
};
return { toggle };
},
样式表
补全层叠样式表:
<style lang="scss">
@mixin layout($r, $d) {
$r2: $r - $d;
display: inline-block;
position: relative;
border: none;
background: #adadad;
outline: none;
transition: background-color 250ms;
cursor: pointer;
:focus {
outline: none;
}
> div {
position: absolute;
background: white;
border-radius: 50%;
transition: left 250ms;
height: $r2;
width: $r2;
top: $d/2;
left: $d/2;
}
height: $r;
width: $r * 2;
border-radius: $r / 2;
&.active {
background: var(--color);
> div {
left: calc(100% - #{$r2} - #{$d/2});
}
}
}
$r: 20px;
$d: 4px;
.jeremy-swicth[size="small"] {
@include layout($r, $d);
}
.jeremy-swicth[size="middle"] {
@include layout($r * 1.5, $d * 1.5);
}
.jeremy-swicth[size="large"] {
@include layout($r * 2, $d * 2);
}
.jeremy-swicth[disabled] {
cursor: not-allowed;
}
</style>
测试
创建一个测试页,导入 JeremySwitch 组件,看一下效果:

项目地址
GitHub: https://github.com/JeremyWu917/jeremy-ui
官网地址
JeremyUI: https://ui.jeremywu.top
感谢阅读
07- Vue3 UI Framework - Switch 组件的更多相关文章
- 05 - Vue3 UI Framework - Button 组件
官网基本做好了,接下来开始做核心组件 返回阅读列表点击 这里 目录准备 在项目 src 目录下创建 lib 文件夹,用来存放所有的核心组件吧.然后再在 lib 文件夹下创建 Button.vue 文件 ...
- 06 - Vue3 UI Framework - Dialog 组件
做完按钮之后,我们应该了解了遮罩层的概念,接下来我们来做 Dialog 组件! 返回阅读列表点击 这里 需求分析 默认是不可见的,在用户触发某个动作后变为可见 自带白板卡片,分为上中下三个区域,分别放 ...
- 08 - Vue3 UI Framework - Input 组件
接下来再做一个常用的组件 - input 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 input 组件有两种类型,即 input 和 textarea 类型 当类型为 ...
- 09 - Vue3 UI Framework - Table 组件
接下来做个自定义的表格组件,即 table 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 基于原生 table 标签的强语义 允许用户自定义表头.表体 可选是否具有边框 ...
- 10 - Vue3 UI Framework - Tabs 组件
标签页是非常常用的组件,接下来我们来制作一个简单的 Tabs 组件 返回阅读列表点击 这里 需求分析 我们先做一个简单的需求分析 可以选择标签页排列的方向 选中的标签页应当有下划线高亮显示 切换选中时 ...
- 11 - Vue3 UI Framework - Card 组件
卡片是非常常用也是非常重要的组件,特别是在移动端的众多应用场景中,随便打开一个手机 App ,您会发现充斥着各种各样的卡片. 所以,我们也来制作一个简易的 Card 组件 返回阅读列表点击 这里 需求 ...
- 00 - Vue3 UI Framework - 阅读辅助列表
阅读列表 01 - Vue3 UI Framework - 开始 02 - Vue3 UI Framework - 顶部边栏 03 - Vue3 UI Framework - 首页 04 - Vue3 ...
- 04 - Vue3 UI Framework - 文档页
官网的首页做完了,接下来开始做官网的文档页 返回阅读列表点击 这里 路由设计 先想想我们需要文档页通向哪些地方,这里直接给出我的设计: 所属 子标题 跳转路径 文件名(*.vue) 指南 介绍 /do ...
- 01 - Vue3 UI Framework - 开始
写在前面 一年多没写过博客了,工作.生活逐渐磨平了棱角. 写代码容易,写博客难,坚持写高水平的技术博客更难. 技术控决定慢慢拾起这份坚持,用作技术学习的阶段性总结. 返回阅读列表点击 这里 开始 大前 ...
随机推荐
- Spring Cloud Gateway自定义过滤器实战(观测断路器状态变化)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- [cf787E]Till I Collapse
考虑对询问分块,对于i<K的询问,暴力处理,时间复杂度为o(Kn):对于i>K的询问,发现答案都小于n/K且满足单调性,那么可以二分出每一段相同的答案,时间复杂度为$o(n^{2}log_ ...
- [第四篇] PostGIS:“我让PG更完美!”
概要 本篇文章主要分为几何图形处理函数.仿生变换函数.聚类函数.边界分析函数.线性参考函数.轨迹函数.SFCGAL 函数.版本函数这八部分. Geometry Processing ST_Buffer ...
- 【POJ2018】【实数域上的二分】【dp】
传送门:http://poj.org/problem?id=2018: 大概题意是求一个正整数数列 A 的平均数最大 长度不小于 L 的子段 我们可以二分答案 判定是否有一个长度不小于L的子段 平均数 ...
- 【状压dp】Hamiton路径
描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点 ...
- CF1444C Team-Building
考虑我们判定二分图染色的经典算法: 染色. 我们把所有不同颜色块之间的边都保存下来. 只在图中保留相同颜块之间的边,并对其染色. 我们考虑记\(g_i\)为一个点的所在联通块编号,\(f_i\)为他在 ...
- O(1)判断两点之间是否有边
O(1)判断两点之间是否有边 问题描述 给定一张 \(n\) 个点,\(m\) 条边的有向图. 多次询问,要求每次 \(\mathcal{O}(1)\) 判断两点之间是否有边(你可以忽略输入.输出等问 ...
- 【WEGO】GO注释可视化
导入数据 BGI开发的一款web工具,用于可视化GO注释结果.自己平时不用,但要介绍给别人,简单记录下要点,避免每次授课前自己忘了又要摸索. 地址:http://wego.genomics.org.c ...
- bwa比对软件的使用以及其结果文件(sam)格式说明
一.bwa比对软件的使用 1.对参考基因组构建索引 bwa index -a bwtsw hg19.fa # -a 参数:is[默认] or bwtsw,即bwa构建索引的两种算法,两种算法都是 ...
- 论 Erda 的安全之道
作者|陈建锋 来源|尔达 Erda 公众号 软件研发是一个复杂的工程,不仅需要进行软件的设计.开发.测试.运维,还涉及到大量的人力.物力管理.今天讨论的主角 - "安全",在软 ...