Vue.js 中制作自定義選擇組件的代碼附演示demo
定制 select 標(biāo)簽的設(shè)計(jì)非常困難。有時(shí)候,如果不使用樣式化的 div 和自定義 JavaScript 的結(jié)合來(lái)構(gòu)建自己的腳本,那是不可能的。在本文中,你將學(xué)習(xí)如何構(gòu)建使用完全自定義 CSS 設(shè)置樣式的 Vue.js 組件。
Demo: https://codesandbox.io/s/custom-vuejs-select-component-8nqgd
HTML
<template>
<div
class="custom-select"
:tabindex="tabindex"
@blur="open = false"
>
<div
class="selected"
:class="{open: open}"
@click="open = !open"
>
{{ selected }}
</div>
<div
class="items"
:class="{selectHide: !open}"
>
<div
class="item"
v-for="(option, i) of options"
:key="i"
@click="selected=option; open=false; $emit('input', option)"
>
{{ option }}
</div>
</div>
</div>
</template>
需要注意以下幾點(diǎn):
- tabindex 屬性使我們的組件能夠得到焦點(diǎn),從而使它變得模糊。當(dāng)用戶在組件外部單擊時(shí), blur 事件將關(guān)閉我們的組件。
- input 參數(shù)發(fā)出選定的選項(xiàng),父組件可以輕松地對(duì)更改做出反應(yīng)。
JavaScript
<script>
export default {
props:{
options:{
type: Array,
required: true
},
tabindex:{
type: Number,
required: false,
default: 0
}
},
data() {
return {
selected: this.options.length > 0 ? this.options[0] : null,
open: false
};
},
mounted(){
this.$emit('input', this.selected);
}
};
</script>
另外,要注意的重要事項(xiàng):
我們還會(huì)在 mount 上發(fā)出選定的值,以便父級(jí)不需要顯式設(shè)置默認(rèn)值。如果我們的 select 組件是較大表單的一部分,那么我們希望能夠設(shè)置正確的 tabindex 。
CSS
<style scoped>
.custom-select {
position: relative;
width: 100%;
text-align: left;
outline: none;
height: 47px;
line-height: 47px;
}
.selected {
background-color: #080D0E;
border-radius: 6px;
border: 1px solid #858586;
color: #ffffff;
padding-left: 8px;
cursor: pointer;
user-select: none;
}
.selected.open{
border: 1px solid #CE9B2C;
border-radius: 6px 6px 0px 0px;
}
.selected:after {
position: absolute;
content: "";
top: 22px;
right: 10px;
width: 0;
height: 0;
border: 4px solid transparent;
border-color: #fff transparent transparent transparent;
}
.items {
color: #ffffff;
border-radius: 0px 0px 6px 6px;
overflow: hidden;
border-right: 1px solid #CE9B2C;
border-left: 1px solid #CE9B2C;
border-bottom: 1px solid #CE9B2C;
position: absolute;
background-color: #080D0E;
left: 0;
right: 0;
}
.item{
color: #ffffff;
padding-left: 8px;
cursor: pointer;
user-select: none;
}
.item:hover{
background-color: #B68A28;
}
.selectHide {
display: none;
}
</style>
該 CSS只是一個(gè)示例,你可以按照你的需求隨意修改樣式。
我希望這可以幫助你創(chuàng)建自己的自定義選擇組件,以下是完整組件要點(diǎn)的鏈接:
最后,在線演示的示例:https://codesandbox.io/s/custom-vuejs-select-component-8nqgd
總結(jié)
到此這篇關(guān)于Vue.js 中制作自定義選擇組件的代碼附演示demo的文章就介紹到這了,更多相關(guān)vuejs自定義選擇組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于vue 項(xiàng)目中瀏覽器跨域的配置問(wèn)題
這篇文章主要介紹了vue 項(xiàng)目中瀏覽器跨域的配置問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
詳解VUE里子組件如何獲取父組件動(dòng)態(tài)變化的值
這篇文章主要介紹了詳解VUE里子組件如何獲取父組件動(dòng)態(tài)變化的值,子組件通過(guò)props獲取父組件傳過(guò)來(lái)的數(shù)據(jù),子組件存在操作傳過(guò)來(lái)的數(shù)據(jù)并且傳遞給父組件,需要的朋友可以參考下2018-12-12
Vue項(xiàng)目webpack打包部署到Tomcat刷新報(bào)404錯(cuò)誤問(wèn)題的解決方案
今天很郁悶,遇到這樣一個(gè)奇葩問(wèn)題,使用webpack打包vue后,將打包好的文件,發(fā)布到Tomcat上,訪問(wèn)成功,但是刷新后頁(yè)面報(bào)404錯(cuò)誤,折騰半天才解決好,下面小編把Vue項(xiàng)目webpack打包部署到Tomcat刷新報(bào)404錯(cuò)誤問(wèn)題的解決方案分享給大家,需要的朋友一起看看吧2018-05-05
el-select選擇器組件下拉框增加自定義按鈕的實(shí)現(xiàn)
本文主要介紹了el-select選擇器組件下拉框增加自定義按鈕的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問(wèn)題
這篇文章主要介紹了vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Vue中Router路由兩種模式hash與history詳解
這篇文章主要介紹了Vue中Router路由的兩種模式,分別對(duì)hash模式與history模式作了簡(jiǎn)要分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
關(guān)于Vue源碼vm.$watch()內(nèi)部原理詳解
這篇文章主要介紹了關(guān)于Vue源碼vm.$watch()內(nèi)部原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Vue項(xiàng)目如何部署到Tomcat服務(wù)器上
這篇文章主要介紹了Vue項(xiàng)目如何部署到Tomcat服務(wù)器上,Vue中自帶webpack,可以通過(guò)一行命令將項(xiàng)目打包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03

