1. 程式人生 > >Vue.js做select下拉列表(ul-li標籤仿select標籤)

Vue.js做select下拉列表(ul-li標籤仿select標籤)

目標:用ul-li標籤結合Vue.js知識做一個模仿select標籤的下拉選項列表。
知識點:

  • 元件的寫法及運用
  • 元件之間的資料傳遞(props的運用)
  • 元件之間的資料傳遞($emit的運用)
  • 動態資料的繫結(v-bind)
  • 自定義事件通訊

    效果圖:

1、未做任何操作前,下拉列表為隱藏狀態
未操作前
2、點選輸入框顯示下拉列表
顯示下拉列表

3、 點選列表項,輸入框值跟隨改變
輸入框值變化

PS: 為了演示data1, data2兩組資料的繫結,例項中建立了兩個列表
這裡寫圖片描述

html程式碼:

<!DOCTYPE html>
<html>

<head>
    <meta
charset="UTF-8">
<title>ul-li模仿select下拉選單</title> <link rel="stylesheet" type="text/css" href="style.css" /> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="demo"> <my-select btn-name='search' v-bind:list
='data1' style='float: left;margin-right: 2rem;'>
</my-select> <my-select btn-name='搜尋' v-bind:list='data2' style='float: left;'></my-select> </div> </body> </html>

JavaScript程式碼

<script type="text/javascript">
//註冊全域性元件
//在my-select元件中套用ul-select元件,my-select為父元件ul-select為子元件
Vue.component('my-select', { //元件中data要寫成函式形式 data() { return { ulShow: false, //預設ul不顯示,單擊input改變ul的顯示狀態 selectVal: '' //選項值,input的值與選項值動態繫結 } }, //父元件向子元件通訊用props props: ['btnName', 'list'], template: ` <div id="selectWrap"> <div class="searchBox"> <input type="text" :value="selectVal" @click='ulShow = !ulShow'/> <a href="#" class="search" v-text='btnName'></a> </div> <my-ul v-show='ulShow' v-bind:list='list' v-on:receive='changeVal'></my-ul> </div> `, methods: { changeVal(value) { this.selectVal = value } } }) //子元件 Vue.component('my-ul', { props: ['list'], template: ` <ul class="skill"> <li v-for='item of list' v-on:click='selectLi(item)'>{{item}}</li> </ul> `, methods: { selectLi: function(item) { //$emit觸發當前例項上的自定義事件 receive this.$emit('receive', item); } } }) //建立Vue例項 new Vue({ el: '#demo', //定義兩組資料分別傳遞到兩個元件的li中,兩個列表的操作互不影響 data: { data1: ['CSS', 'HTML', 'JavaScript'], data2: ['Vue.js', 'Node.js', 'Sass'], } }) </script>

CSS樣式

ul, li {
    margin: 0;
    padding: 0;
    list-style: none;
}
#selectWrap {
    width: 250px;
    padding: 2rem;
    background: #4682b4;
}
.searchBox input, .searchBox a {
    line-height: 1.5rem;
    height: 1.5rem;
    margin-bottom: 1rem;
    padding: 0 5px;
    vertical-align: middle;
    border: 1px solid #aaa;
    border-radius: 5px;
    outline: none;
}
.searchBox a {
    display: inline-block;
    text-decoration: none;
    background-color: #b1d85c;
}
.skill li {
    font-size: 18px;
    line-height: 2rem;
    height: 2rem;
    padding-left: 5px;
    cursor: pointer;
}
.skill li:hover {
    background-color: #008b45;
}