Switch组件
Switch组件,业务需求中经常遇到。我司的旧项目中,由于没有使用较为成熟点的组件库。自己实现了一个switch组件,但是实现的略微有些丑陋。
实现基本需求
https://jsfiddle.net/huang_ju...
这里,需要实现基础的切换功能和禁用功能。
```<template id="switch">
<div class="el-switch"
@click="handleChange"
:class="{'is-checked': value, 'is-disabled': disabled}">
<input type="checkbox" ref="input">
<span class="el-switch__content">
<span class="el-switch__button" :style="{transform}"></span>
</span>
</div>
</template>
```
let ElSwitch = {
name: 'ElSwitch',
template: '#switch',
props: {
value: {
type: [Boolean],
default: false
},
disabled: {
type: [Boolean],
default: false
}
},
computed: {
transform() {
return this.value ? `translate3d(20px, 0, 0)` : '';
}
},
methods: {
handleChange() {
if (!this.disabled) {
this.$emit('input', !this.value);
this.$nextTick(() => {
this.$refs.input.checked = this.value;
});
}
}
},
mounted() {
this.$refs.input.checked = this.value;
}
};
这里需要注意一点,对于自定义的表单组件,Element绑定值到组件中,是用的v-model。而v-model只是一个语法糖,是以下这种的简化形式:
```<input v-model="something">
<input
v-bind:value="something"
v-on:input="something = $event.target.value">
<p>所以,为了当组件内部值发生改变的时候,可以将变化的值传出来,需要使用这句:</p>
this.$emit('input', value);
<p>更具体的,可以参考Vue文档:<a href="https://cn.vuejs.org/v2/guide/components.html#%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BA%8B%E4%BB%B6%E7%9A%84%E8%A1%A8%E5%8D%95%E8%BE%93%E5%85%A5%E7%BB%84%E4%BB%B6" rel="nofollow noreferrer">使用自定义事件的表单输入组件</a></p>
<p>其次,我们在模板中加了一个 type:checkbox 的input。这不是摆设,当switch组件用在表单中的时候,可能会用到<code>form.name.checked</code>。所以,我们需要在值改变的时候,也改变input.chekced属性。<strong>这里存在一个时机问题吧,因为v-model绑定了值到组件中,组件中不能直接修改这个值为true来进行改变,需要触发input事件,所以,这里checked的改变需要等到下一次渲染的时候,再进行设置</strong>。</p>
<h2>自定义activeValue、背景色、宽度</h2>
<p><a href="https://jsfiddle.net/huang_jusheng/La5koerg/" rel="nofollow noreferrer">https://jsfiddle.net/huang_ju...</a></p>
<p>自定义activeValue的点在于,有些情况下,switch的值可能是0、1.不能确定就一定是true或者false</p>
<p>emm....实现了下,发现也没什么难点,主要关注下改变背景色这一段的代码吧,我觉得写着还是挺好的</p>
let ElSwitch = {
name: 'ElSwitch',
template: '#switch',
props: {
// ...
},
computed: {
checked() {
return this.value === this.activeValue;
},
// ...
},
methods: {
handleChange() {
//...
},
setBackgroundColor() {
let newColor = this.checked ? this.activeColor : this.inactiveColor;
this.$refs.content.style.borderColor = newColor;
this.$refs.content.style.backgroundColor = newColor;
}
},
watch: {
checked() {
this.$refs.input.checked = this.value;
if (this.activeColor || this.inactiveColor) {
this.setBackgroundColor();
}
}
},
created() {
if (!~[this.activeValue, this.inactiveValue].indexOf(this.value)) {
this.$emit('input', this.inactiveValue);
}
},
mounted() {
this.$refs.input.checked = this.checked;
if (this.activeColor || this.inactiveColor) {
this.setBackgroundColor();
}
}
};
<p>改变背景颜色,是发生在<code>this.$emit('input',value)</code>之后的,这有一个执行顺序的问题。如果在this.$nextTick中进行改变背景色也行,效果一样,只是handleChange的代码长一点。但这里通过监听computed属性(checked),来做响应式改变,代码,emm....,感觉是更加清晰了点吧。</p>
<h2>总结</h2>
<p>Switch插件的编写不是很难,可以关注两点:</p>
<ul>
<li>通过watch监听computed属性,作为初学者,这点以后可以关注一下</li>
<li>多巧用ref,获取节点、设置属性很方便</li>
</ul>
原文地址:https://segmentfault.com/a/1190000014253606
Switch组件的更多相关文章
- 用switch组件控制一个元素的显示和隐藏状态
微信小程序开发(交流QQ群:604788754) WXML: <view class="body-view"> <switch bindchange=" ...
- vue.js开发之开关(switch)组件
最近开发组件的时候,自定义开发了开关(switch)组件,现将代码整理如下,方便日后复用. toggle-switch.vue <template> <label role=&quo ...
- 微信小程序switch组件尺寸控制
1.修改switch组件的属性值 /* switch */ .wx-switch-input{ width: 82rpx!important; height: 40rpx!important; } / ...
- 小程序的switch组件
小程序的switch开关组件,总结下大概有三种使用场景. 其一: 纯展示场景, 用来展示某个开关值是打开还是关闭的,这个场景比较简单,给个disabled属性就ok了: 其二: 用户点击后立即切换开关 ...
- 微信小程序把玩(二十一)switch组件
原文:微信小程序把玩(二十一)switch组件 switch开关组件使用主要属性: wxml <!--switch类型开关--> <view>switch类型开关</vi ...
- Flutter——Switch组件(开关组件)
Switch组件常用的属性: 属性 描述 value 单选的值 onChanged 改变时触发 activeColor 选中的颜色.背景颜色 import 'package:flutter/mater ...
- 小程序自定义switch组件
如上图,小程序api中的switch组件只能自定义颜色,不能自定义宽高,所以就开始了自己写switch组件. 自定义组件样式 switch组件样式大致如图,样式思路:未选中时为一个长方形有圆角按钮,和 ...
- 07- Vue3 UI Framework - Switch 组件
为了更好的提升用户体验,我们这里再做一个很常用的开关组件 switch 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 switch 组件应分为选中/未被选中,两种状态 可以通过 ...
- react的diff算法与antd中switch组件不更新问题
问题描述: 现在有个需求,现有一个列表table,里面的数据有启用的也有关闭的,switch组件会根据数据状态展示,同时进行排序,启用数据在前面,未启用的在后面.如图 然后现在需要操作,假如我将第四条 ...
随机推荐
- debian使用过程中常见的问题
1 wget https://www.dropbox.com ERROR: The certificate of `www.dropbox.com' is not trusted. ERROR: Th ...
- Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图 OSM(OpenStreetMap-开放街道地图)服务就是一种发布自己地图数据图片为服务的一种实现类型,开放街道 ...
- 【POJ 2689】 Prime Distance
[题目链接] http://poj.org/problem?id=2689 [算法] 我们知道,一个在区间[l,r]中的合数的最小质因子必然不超过sqrt(r) 那么,先暴力筛出1-50000中的质数 ...
- Core Data的那点事儿~
一.介绍下Core Data CoreData在早些年iOS开发中使用不多,因为其本身性能略低,以及不使用SQL语句而失去的灵活性,再加上FMDB之类封装SQLite的三方框架很好用,所以一直不受待见 ...
- Vue.js中学习使用Vuex详解
在SPA单页面组件的开发中 Vue的vuex和React的Redux 都统称为同一状态管理,个人的理解是全局状态管理更合适:简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一 ...
- ACM_小游戏(棋盘博弈)
Problem Description: 最近kiki无事可做,于是他想玩棋盘游戏.棋盘的大小是n * m.首先,棋子放置在右上角(1,m). 每次可以将棋子向左方,下方或左下方移动一个位置.当移动到 ...
- UNIX环境高级编程--5
标准I/O库流和FILE对象: 所有I/O函数都是围绕文件描述符的.当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作.当用标准I/O库打开或者创建一个文件时,我们已 ...
- 【转】Linux中的LVM
转自:http://www.cnblogs.com/net2012/p/3365904.html 逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑 ...
- java环境搭建(及安装问题“No repository found containing”解决) 并创立第一个java程序
环境: java8 及 Eclipse java8 配置:http://jingyan.baidu.com/article/e2284b2b5967e7e2e7118d74.html Eclipse ...
- InputStream和Reader
java.io下面有两个抽象类:InputStream和ReaderInputStream是表示字节输入流的所有类的超类Reader是用于读取字符流的抽象类InputStream提供的是字节流的读取, ...