Vue封装select下拉组件

Posted z-j-c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue封装select下拉组件相关的知识,希望对你有一定的参考价值。

首先新建一个Input.vue组件

  1 <template>
  2 <div class="selectWrap">
  3   <div class="select-wrapper">
  4     <div class="select" @click = "triggerOption">
  5       <div class="select-content">{{selectContent.text}}</div>
  6       <div class="triangle-wrapper">
  7         <div id="triangle-down"></div>
  8       </div>
  9     </div>
 10     <div class="option-wrapper" style="display: none;">
 11         <!-- 渲染父组件传来的值 -->
 12       <div class="option-item" v-for = "(item,index) in subject" :key="index" @mouseout="out($event)" @mouseover="move($event)" @click = "choose(item)">{{item.text}}</div>
 13     </div>
 14   </div>
 15 </div>
 16 </template>
 17 <script>
 18   export default{
 19     props:{
 20       selectWidth:{
 21         type:Number,
 22         default:100,
 23       },
 24     //   接受父组件传过来的值
 25       subject:{
 26           type:Array
 27       },
 28       selectContent:{
 29         type:Object,
 30         default:function(){
 31           return {value:0,text:"请选择"}
 32         }
 33       },
 34     },
 35     mounted(){
 36       document.querySelector(".selectWrap").style.width = this.selectWidth+"px";
 37     },
 38     computed:{
 39       optionWrapper(){
 40         return document.querySelector(".option-wrapper");
 41       },
 42       selectCon(){
 43         return document.querySelector(".select-content");
 44       },
 45       subjectList(){
 46         return document.getElementsByClassName("option-item");
 47       },
 48     },
 49     methods:{
 50       move(event){
 51         for(var item of this.subjectList){
 52           item.classList.remove("hover");
 53         }
 54         event.currentTarget.classList.add("hover");
 55       },
 56       out(event){
 57         event.currentTarget.classList.remove("hover");
 58       },
 59       triggerOption(){
 60         if (this.optionWrapper.style.display == "none") {
 61           this.optionWrapper.style.display = "block";
 62         }else{
 63           this.optionWrapper.style.display = "none";
 64         }
 65         for(var item of this.subjectList){
 66           if (item.innerhtml == this.selectContent.text) {
 67             item.classList.add("hover");
 68           }else{
 69             item.classList.remove("hover");
 70           }
 71         }
 72       },
 73       choose(item,value){
 74         this.selectContent.text = item.text;
 75         this.optionWrapper.style.display = "none";
 76         this.$emit("changeSelect",this.selectContent.text,this.selectContent.value);
 77       }
 78     },
 79   }
 80 </script>
 81 <style>
 82   .select{
 83     position: relative;
 84     overflow: hidden;
 85     padding-right: 10px;
 86     min-width: 80px;
 87     width: 100%;
 88     height: 20px;
 89     line-height: 20px;
 90     border: 1px solid #000;
 91     cursor: default;
 92     font-size: 13px;
 93   }
 94   .select-content{
 95     text-align: left;
 96   }
 97   .triangle-wrapper{
 98     position: absolute;
 99     right: 0;
100     top: 50%;
101     transform: translateY(-50%);
102     width: 18px;
103     height: 20px;
104     background-color: #fff;
105     cursor: default;
106   }
107   #triangle-down{
108     position: absolute;
109     right: 5px;
110     top: 50%;
111     transform: translateY(-50%);
112     width: 0;
113     height: 0;
114     border-left: 3px solid transparent;
115     border-right: 3px solid transparent;
116     border-top: 6px solid #000;
117   }
118   .option-wrapper{
119     position: relative;
120     overflow: hidden;
121     min-width: 80px;
122     width: 100%;
123     border-right: 1px solid #000;
124     border-bottom: 1px solid #000;
125     border-left: 1px solid #000;
126   }
127   .option-item{
128     min-width: 80px;
129     height: 20px;
130     line-height: 20px;
131     padding-right: 10px;
132     text-align: left;
133     cursor: default; 
134   }
135   .hover{
136     background-color: rgb(30,144,255);
137     color:#fff !important;
138   }
139 </style>

在父组件中调用Input组件,并且进行传值

<template>
  <div>
    // 向Input进行传值
    <Input v-bind:subject="subject" />
  </div>
</template>

<script>
import Input from "../src/components/Input";
export default {
  name: "App",
  components: {
    Input
  },
  data() {
    return {
      subject: [
        {
          value: "1",
          text: "111"
        },
         {
          value: "2",
          text: "222"
        },
        {
          value: "3",
          text: "333"
        },
        {
          value: "4",
          text: "444"
        }
      ]
    };
  }
};
</script>

<style lang="less">

</style>
    

技术图片

以上是关于Vue封装select下拉组件的主要内容,如果未能解决你的问题,请参考以下文章

element下拉树选择组件封装

element下拉树选择组件封装

element下拉树选择组件封装

vue--封装后台管理项目通用组件

vue自定义下拉框组件

vue + elemen可远程搜索select选择器的封装(思路及源码分享)