美文网首页
vue封装的h5下拉多选select

vue封装的h5下拉多选select

作者: 李仁平 | 来源:发表于2021-09-03 17:21 被阅读0次

    封装效果:
    样式根据自己的设计图更改。


    image.png image.png

    代码如下:

    <template>
    <div>
       <div class="h5-select-multiple">
           <div  class="h5-select-multiple-value">{{value.length==0?'请选择':valueLabel}}</div>
           <div  @click.stop="clickShow">
               <img src="./up.png" v-if="show" alt="">
               <img src="./lower.png" v-else alt="">
           </div>
       </div>
       <div class="h5-select-multiple-content" v-show="show" >
           <div @click="getValue(item)" v-for="(item,index) in optionsData" :key="index" class="h5-select-multiple-content-row">
               <span class="h5-select-multiple-content-span">
               {{item.label}}
               </span>
               <img src="./yes.png" v-show="value.includes(item.value)" class="yesImg"/>
           </div>
       </div>
    </div>
    </template>
    
    <script>
      export default {
      name: 'h5-select-multiple',
      props: {
        value:{ //选中值
            type: Array,
            required: true
        },
        label:{ // 要显示的名称
            default: '',
            required: false
        },
        keyValue:{ // 要绑定的key如:id
            default: '',
            required: false
        },
        options: { // 要显示的集合格式:[{}]
            type: Array,
            required: true
        },
      },
      data(){
        return {
            optionsData:this.options,
            valueLabel:'',
            show:false
        }
      },
       methods:{
           clickShow(){
               this.show = !this.show
           },
            getValue(item){
                if(this.value.includes(item.value)){ // 判断是否选中如果已选中再次点击删除
                   if(this.value.length>1){ // 选中数量大于1,对选中名称进行字符串处理
                       if(this.valueLabel.indexOf(item.label)===0){
                           this.valueLabel = this.valueLabel.replace(item.label +"," ,'')
                       }
                       else{
                           this.valueLabel = this.valueLabel.replace("," +item.label,'')
                       }
                   }
                   else{
                       // 使用toString()转成字符串,防止
                      this.valueLabel =  this.valueLabel.toString().replace(item.label,'')
                   }
                   this.value.splice([this.value.indexOf(item.value)],1);
                }
                else{ // 没有选中时直接添加
                    this.value.push(item.value);
                    if(this.value.length>1){
                      this.valueLabel = this.valueLabel + "," + item.label 
                    }
                   else{
                       this.valueLabel =  item.label
                   }
                    
                } 
                this.optionsData = [...this.options];
                this.$emit('change',{value:this.value,valueLabel:this.valueLabel})
            }
        },
        mounted(){
            // 对绑定的label,key转换
            this.options.forEach(item=>{
                if(this.label){
                    item.label = item[this.label]
                }
                if(this.keyValue){
                    item.value = item[this.keyValue]
                }
            })
            // 点击下拉内容以外的隐藏下拉内容
            document.addEventListener('click',e=>{
              // console.log(e.target)
              let className = ['h5-select-multiple-content-row','yesImg','h5-select-multiple-content-span'];
                if(!className.includes(e.target.className)){
                    this.show = false
                }
            })
        }
    }
    </script>
    
    <style>
     .h5-select-multiple{
         display: flex;
        font-size: 1.6rem;
     }
     .h5-select-multiple img,.h5-select-multiple-content img{
        width: 2.4rem;;
        height: 2.4rem;
     }
     .h5-select-multiple-value{
         min-width: 6rem;
     }
     .h5-select-multiple-content{
         font-size: 1.6rem;
         width: 8rem;
         max-height: 11rem;
         overflow-y: auto;
         border: 1px solid #ccc;
     }
     .h5-select-multiple-content-row{
         display: flex;
         justify-content: space-between;
         align-items: center;
         padding: 0.4rem 0;
     }
     .h5-select-multiple-content-row span{
         padding-left: 2px;
     }
    </style>
    

    源码查看: npm i h5-select-multiple


    image.png

    想知道npm怎么发插件的查看我的npm发布自己的vue包文章。
    喜欢的点赞关注,小编不定时分享更多精彩内容。

    相关文章

      网友评论

          本文标题:vue封装的h5下拉多选select

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