码迷,mamicode.com
首页 > Web开发 > 详细

css模拟下拉框,vue获取双向绑定的值

时间:2016-11-08 22:40:02      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:for循环   size   获取值   mod   下拉   block   lis   put   round   

原生的下拉框用vue获取值双向绑定简直不要太好用,Duang的一下就行了

<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:

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:{}
});

 

下面是模拟下拉框框

<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>

但是原生的样子特别不好看 修改样式的时候几乎不可修改,所以大部分都是用其他标签模拟这个效果。但是在获取值 设置值的时候就多了许多js 不知道浏览器为什么不能用css修改这个下拉框框 感觉和奇怪估计以后会出现css可以修改吧;

下面是模拟下拉框框

<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:

//日期下拉框
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的值。

 

css模拟下拉框,vue获取双向绑定的值

标签:for循环   size   获取值   mod   下拉   block   lis   put   round   

原文地址:http://www.cnblogs.com/fstgshow/p/6044816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!