为了更好的提升用户体验,我们这里再做一个很常用的开关组件 switch

返回阅读列表点击 这里

需求分析

开始之前我们先做一个简单的需求分析

  1. switch 组件应分为选中/未被选中,两种状态
  2. 可以通过点击变更选中状态
  3. 不同的选中状态有不同的颜色,且有滑块处于不同的端
  4. 可以指定不同的尺寸
  5. 可以自定义颜色
  6. 可以设置为禁用

那么可以整理出以下参数表格

参数 含义 类型 可选值 默认值
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 组件的更多相关文章

  1. 05 - Vue3 UI Framework - Button 组件

    官网基本做好了,接下来开始做核心组件 返回阅读列表点击 这里 目录准备 在项目 src 目录下创建 lib 文件夹,用来存放所有的核心组件吧.然后再在 lib 文件夹下创建 Button.vue 文件 ...

  2. 06 - Vue3 UI Framework - Dialog 组件

    做完按钮之后,我们应该了解了遮罩层的概念,接下来我们来做 Dialog 组件! 返回阅读列表点击 这里 需求分析 默认是不可见的,在用户触发某个动作后变为可见 自带白板卡片,分为上中下三个区域,分别放 ...

  3. 08 - Vue3 UI Framework - Input 组件

    接下来再做一个常用的组件 - input 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 input 组件有两种类型,即 input 和 textarea 类型 当类型为 ...

  4. 09 - Vue3 UI Framework - Table 组件

    接下来做个自定义的表格组件,即 table 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 基于原生 table 标签的强语义 允许用户自定义表头.表体 可选是否具有边框 ...

  5. 10 - Vue3 UI Framework - Tabs 组件

    标签页是非常常用的组件,接下来我们来制作一个简单的 Tabs 组件 返回阅读列表点击 这里 需求分析 我们先做一个简单的需求分析 可以选择标签页排列的方向 选中的标签页应当有下划线高亮显示 切换选中时 ...

  6. 11 - Vue3 UI Framework - Card 组件

    卡片是非常常用也是非常重要的组件,特别是在移动端的众多应用场景中,随便打开一个手机 App ,您会发现充斥着各种各样的卡片. 所以,我们也来制作一个简易的 Card 组件 返回阅读列表点击 这里 需求 ...

  7. 00 - Vue3 UI Framework - 阅读辅助列表

    阅读列表 01 - Vue3 UI Framework - 开始 02 - Vue3 UI Framework - 顶部边栏 03 - Vue3 UI Framework - 首页 04 - Vue3 ...

  8. 04 - Vue3 UI Framework - 文档页

    官网的首页做完了,接下来开始做官网的文档页 返回阅读列表点击 这里 路由设计 先想想我们需要文档页通向哪些地方,这里直接给出我的设计: 所属 子标题 跳转路径 文件名(*.vue) 指南 介绍 /do ...

  9. 01 - Vue3 UI Framework - 开始

    写在前面 一年多没写过博客了,工作.生活逐渐磨平了棱角. 写代码容易,写博客难,坚持写高水平的技术博客更难. 技术控决定慢慢拾起这份坚持,用作技术学习的阶段性总结. 返回阅读列表点击 这里 开始 大前 ...

随机推荐

  1. 高德地图 JS API (jsp + miniui(子页面数据返回父页面并设值) + 单个点标记 + 点标记经纬度 + 回显 + 限制地图显示范围+搜索)

    -*-  父页面js function mapFocus(){ //console.log("-*-"); var longitude = mini.get("jd&qu ...

  2. netcore项目中IStartupFilter使用

    背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件.它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口.相当于去掉host,这样省掉了些指定 ...

  3. [spojQTREE5]Query on a tree V

    合理的正解大概是动态点分治,这里给出其实现 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 st ...

  4. [loj2863]组合动作

    先用两次猜出第一个字符,后面就不会出现这个字符了 (我们假设这个字符是c0,其余三种字符分别是c1.c2和c3) ,然后考虑已知s的前i个字符(不妨就s),来推出后面的字符 询问:s+c1和s+c2, ...

  5. [bzoj1084]最大子矩阵

    用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include ...

  6. [noi1760]SAM

    建立SAM,求出每一个节点最左边的出现位置(即right集合中的最小元素,在树上dfs即可) 枚举左端点i和右端点j(保证j是最小的满足$s[i,j)$不是$s[0,i)$的子串),维护k表示$s[i ...

  7. go程序不停机重启

    让我们给http服务写一个版本更新接口,让它自动更新版本并重启服务吧. 初步例子 注:为了精简,文中代码都去除了err处理 main.go var Version = "1.0" ...

  8. 【TcaplusDB知识库】如何部署TcaplusDB Local 版

    [TcaplusDB知识库]部署TcaplusDB Local 版的准备操作 1. 版本介绍 TcaplusDB Local版,是为用户提供的一个满足本地开发调试的版本(基于Docker部署的可下载版 ...

  9. 关于postman的接口登录验证问题

    1.shiro的接口登录问题 碰到需要接口登录验证的:访问项目接口地址login,找到cookie将Cookie数据放入postman的headers 中. 2.碰到 security的项目.首先把相 ...

  10. 洛谷 P6772 - [NOI2020]美食家(广义矩阵快速幂)

    题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,第 \(0\) 天的时候你在 \(1\) 号城市,第 \(T\) 天的时候你要回到 \(1\) 号城市. 每条边上的边权表示从城 ...