這是我參與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