css模擬下拉框,vue獲取雙向綁定的值

原生的下拉框用vue獲取值雙向綁定簡直不要太好用,Duang的一下就好了css

<div id="datePrice">
<select v-model="selected" id="dataSel" class="dataSel" v-on:change="change">
<option v-for="item in dateList" v-bind:value="item.date" v-text="item.date"></option>
</select>
</div>

js:vue

var VMdate=new Vue({
    el:'#datePrice',
    data:{
        selected:'請選擇日期',
        serviceType:0,
        dateList:[
{'date':'2016-11'
},
{'date':'2016-10'
},
{'date':'2016-09'
},
//這裏能夠用ajax回調設置,作到動態獲取
],
        Apptype:0,
        num:true,
        input_disabled:true
    },
    methods:{
     change:function(){
  console.log(this.selected);
}

        }
    },
    watch:{}
});

 

可是原生的樣子特別很差看 修改樣式的時候幾乎不可修改,因此大部分都是用其餘標籤模擬這個效果。可是在獲取值 設置值的時候就多了許多js 不知道瀏覽器爲何不能用css修改這個下拉框框 感受和奇怪估計之後會出現css能夠修改吧;ajax

下面是模擬下拉框框數組

<div class="dataSelD fleft" id="datePrice">
   <i class="icon-date-picker-green"></i>
   <input v-model="selected" type="text" v-bind:readonly="input_disabled" id="dataSel" class="dataSel" v-on:click.stop="setselUl">
   <ul >
      <li class="selLI" v-for="item in dateList" v-bind:data-val="item.date"  v-text="item.date" v-on:click.stop="setSelectVal(item.date)"></li>
   </ul>
</div>

用input代替seclet 下面東西用ui li 標籤來模擬
css瀏覽器

.bill .detailMain .serviceCon1 .dataSelD{margin-top: 30px;position: relative;}
.bill .detailMain .serviceCon1 .dataSelD ul{
    display:none;
    left:37px;top:34px;
    position: absolute;
    width:165px;
    border: 1px solid #8aac20;border-top: none;z-index: 999;
}
.bill .detailMain .serviceCon1 .dataSelD ul li{
    font-size:12px;height:28px;
    line-height: 20px;cursor: pointer;
    padding: 5px 0 5px 19px;
    background-color:#ffffff;}
.bill .detailMain .serviceCon1 .dataSelD ul li:hover{
    color:#ffffff;background-color:#8aac20;
}
.bill .detailMain .serviceCon1 .dataSelD .dataSel{width: 164px;height:34px;
    margin-left:38px;font-size: 14px;outline: none;cursor: pointer;
    background-image:url("/img/bill/icon-input-sel-bg.png");
    background-position:147px 14px;
    background-repeat: no-repeat;
    background-size:10px 6px;
    padding: 0 70px 0 15px;border-radius: 0;border:1px solid #ababab;border-left:none;}
.bill .detailMain .serviceCon1 .dataSelD .dataSel[disabled]{background-color:#ffffff;}
.bill .detailMain .serviceCon1 .dataSelD .dataSel:focus,
.bill .detailMain .serviceCon1 .dataSelD .dataSel:hover{
    border-top: 0.5px solid #8aac20;border-bottom: 0.5px solid #8aac20;border-right: 0.5px solid #8aac20;
}

 

css比較多 是個綠的主題 這個能夠任意修改樣式了 變成你想要的
js:ui

//日期下拉框
var VMdate=new Vue({
    el:'#datePrice',
    data:{
        selected:'請選擇日期',
        serviceType:0,
        dateList:[],//這裏是回調設置的數組
        num:true,
        input_disabled:true
    },
    methods:{
        setSelectVal:function(val){
            $('.serviceCon1 .dataSelD ul').css('display','none');
            this.num=true;
            this.selected=val;
            getBillByDate(val,this.Apptype);//項目裏面是請求了另外一個接口
        },
        setselUl:function(){
            if(this.num){
                $('.serviceCon1 .dataSelD ul').css('display','block');
                this.num=false;
            }else{
                $('.serviceCon1 .dataSelD ul').css('display','none');
                this.num=true;
            }

        }
    },
    watch:{}
});
//模擬的下拉框框,首先解決就是框框的失去焦點的問題 這裏用jq
//模擬框框的失去焦點事件 關閉框框下面的li標籤的東西
$(document).on('click',function(e){
    if(e.target.className=='selLI'){
        $('.serviceCon1 .dataSelD ul').css('display','none');
       var $data_val= $(e.target).attr("data-val");
        VMdate.selected=$data_val;
    }
    else{
        $('.serviceCon1 .dataSelD ul').css('display','none');
        VMdate.num=true;
    }
})

 

總體的大體思路
頁面第一次加載 模擬的下拉框框 v-for循環一個數組,產生多個li標籤,可是一開始是沒有值的,什麼也不會顯示。
而後js運行到請求用戶帳單的接口,回調裏面用設置vue實例裏面的數組,觸發視圖更新。頁面出現下拉框框的選擇。
v-mode雙向綁定一個變量到input框框上面 點擊li標籤的出現的值獲取到 設置到vue實例裏面的v-model的變量 實現雙向綁定 視圖更新,js也拿到了值 而後用這個值去請求。
由於是用input框框模擬的下拉框 因此須要jq額外設置失去焦點關閉下面出來li標籤的選項,這裏用的是綁定document一個點擊事件,判斷事件的event對象,框框是否是選項li,若是不是 通通執行隱藏ul的方法 若是點擊的對象是下面的li標籤 就設置vue實例的v-model的變量爲li的值。this

相關文章
相關標籤/搜索