美文网首页
v-model模拟多选复选下拉框选择。

v-model模拟多选复选下拉框选择。

作者: 嗯哼_3395 | 来源:发表于2018-07-07 15:02 被阅读0次

v-model的强大之处。同步输入指令同步改变。模拟复选,多选等。样式比较简单没写主要是逻辑。

image.png

v-model的多选,单选,复选。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="vue.min.js"></script>
    <style>
      *{
         margin:0;
         padding:0;
      }
      #box div{
          padding:20px 20px;
          border-bottom:1px solid red;
      }

    </style>
</head>
<body>
    <div id="box">
        <div>
            <h3>input框的实现</h3>
            <input type="text" v-len="name" >
            <p>{{name}}</p>
        </div>
        <div>
            <h3>checkbox的实现</h3>
            <input type="checkbox" value="我是checkbox1" v-len="che_flag"> 我是checkbox1<br/>
            <input type="checkbox" value="我是checkbox2" v-len="che_flag1"> 我是checkbox2
            <p>{{che_flag}}      {{che_flag1}}</p>
            <p>{{arr}}</p>
        </div>
        <div>
            <h3>单选框的实现</h3>
            <input type="radio" value="one" v-len="str" name="a"> one<br/><!--必须要有name属性-->
            <input type="radio" value="two" v-len="str" name="a"> two
            <p>{{str}}</p>
        </div>
        <div>
            <h3>多选框实现</h3>
            <select v-veb="str1">
                <option>veb</option>
                <option>len</option>
                <option>veblen</option>
            </select>
            <p>{{str1}}</p>
        </div>
    </div>
</body>
    <script>
       Vue.directive("len",{
           inserted:function(el,binding,vnode){
                // console.log(vnode.context.arr)
                if(el.type=="text"){
                    el.value=binding.value;
                    //当input框的值发生改变的时候
                    el.addEventListener("input",function(){
                         vnode.context[binding.expression]=el.value;
                    })          
                }
                if(el.type=="checkbox"){         
                    el.checked=binding.value;  
                    if(el.checked){
                        vnode.context.arr.push(el.value)
                    }
                    el.addEventListener("click",function(){
                         vnode.context[binding.expression]=el.checked;
                         if(vnode.context[binding.expression]){
                             vnode.context.arr.push(el.value)
                         }else{
                            var len=vnode.context.arr.length
                            for(var i=0;i<len;i++){
                                if(vnode.context.arr[i]==el.value){
                                    vnode.context.arr.splice(i,1)
                                }
                            }

                         }
                    })          
                }
                if (el.type==="radio") {
                    el.checked=false;
                    el.addEventListener("click",function(){
                        this.checked=true;
                        vnode.context[binding.expression]=this.value;
                    })
                }           
           },
           //当data发生改变的时候
       
           update:function(el,binding,vnode){
                if(vnode.data.attrs.type=="text"){
                     el.value=binding.value;
                }
                if(vnode.data.attrs.type=="checkbox"){
                     el.checked=binding.value; 
                }
              
           }
       })
       Vue.directive("veb",{
           inserted:function(el,binding,vnode){       
                binding.value=el.selected
                el.addEventListener("change",function(){
                     console.log(el.selected)
                })          

           },
           update:function(el,binding,vnode){

           }
       })
       var box=new Vue({
          el:"#box",
          data:{
              name:"veb",
              che_flag:true,
              che_flag1:true,
              arr:[],
              rad_flag1:false,
              // rad_flag2:false,
              str:"",
              sel_flag:false,
              str1:""
          }
       })

    </script>
</html>

相关文章

网友评论

      本文标题:v-model模拟多选复选下拉框选择。

      本文链接:https://www.haomeiwen.com/subject/mhbwuftx.html