这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战前端
UI
库,用的时候美滋滋,轮到本身搭组件库的时候每每会去参考别人的源码。switch
开关。switch
可能就是我那台小小的iphone
飞行模式的开关了,那时候还不是前端工程师,看到那个以后就以为特别好看简洁,以为其余的都low
爆了。switch
简约的风格给迷住,每每咱们在遇到只有两个选项的问题时更多但愿遇到的是开关而不是下拉框,好比一个表单属性的(是
、否
)(成功
、失败
)switch
组件放到咱们的页面咱们想要的效果是什么?
颜色属性
大小
是否添加文字
)switch
也能够规避一个字段是否必填
必选
,相信你们有遇到过这样的需求,在制做表单时每每须要对某一个字段判断'有没有填写'
'是否为空'
而后弹出一行红色的提示说'此项不能为空'
,然而使用了switch
则能够避免用户不选
选错
这种状况发生也不用丑陋的红色提示占了页面位置。接下来可能用尽量少的代码搭配
element
的源码进行结构说明,配合element Switch源码食用更加美味喔vue
switch
很是简单,在看element
源码以前我也本身写过一个switch
,要想让上图的开关动起来
其实只是中间白色那块在一个绿色的容器里面改变了定位位置而已然而当点击了开关后背景从绿色会变成其余颜色来给一种视觉上是动了起来
。input
值从而实现双向绑定<template>
<div class="el-switch">
<input type="checkbox" class="el-switch__input">
<span ref="core" class="el-switch__core">
</span>
</div>
</template>
复制代码
element
最简单的switch
结构,能够看到外部是由一个div
包裹住input
和span
input
就是方便咱们作双向绑定接收,固然要把他隐藏掉咱们不但愿他出如今页面中,咱们只须要它的功能就行了span
,在element
中这个span
就是外部的容器了,而后在这个容器中巧妙地运用了伪元素来制做一个白色的圈圈,上图是该switch
的基本样式,运用了BEM
的命名结构,若是不了解BEM
的能够看到我以前的一篇介绍,这里主要就是将中间的伪元素作了定位处理让它一开始的时候在最左边。switch
是没有动效的,咱们要给组件传入v-model
绑定属性<template>
<l-switch v-model="value"></l-switch>
</template>
<script>
export default {
data () {
return {
value: false
};
}
}
</script>
复制代码
v-model
进行传值,v-model
提供了一个value
值和一个input
方法,子组件props
接收value
数值并增长一个点击事件改变父组件的input
方法便可实现双向绑定。switch
是可让value
动态变化的,上述默认的是一个圆圈在最左边表明未选中的状况,新增一个圆圈在最右边的class
顺便改变背景颜色,接下来只须要为组件动态切换class
就能够了。template
<div
class="el-switch"
:class="{ 'is-checked': checked }"
@click="switchValue"
>
<input ref="input" type="checkbox" class="el-switch__input" :value="value">
<span ref="core" class="el-switch__core">
</span>
</div>
script
export default {
props:{
value: {
type: [Boolean, String, Number],
default: false
}
},
computed: {
checked() {
return this.value;
},
},
methods:{
switchValue() {
this.handleChange();
},
handleChange() {
this.$emit('input', !this.value);
},
}
};
复制代码
switch
就作好了switch
组件相对于其余复杂组件比较简单,通常的处理逻辑就是父组件要想v-model
一个值到子组件,子组件就必须设置一个value
的props
,而且使用$emit
来改变父组件的input
的事件,再相应的作些处理便可。如何优雅的使用Vuepress编写组件示例(下)👈github
样式命名有多难?浅谈BEM命名规范⚡markdown