• 基于Element的下拉框,多选框的封装


      Element是有自己的多选框的,但是,他的两种表现形式不是我们所想要的。所以,就以Element的下拉多选框为基础,封装了一个自己的多选框。废话不多说,直接上图

     1、增加一个全部的功能,然后让选择全部之后,上面的显示框中只显示“全部”两个字

     2、当显示不全的时候,显示省略号

     3、剩下的交互逻辑,就很简单了,点击,全部,让所有的全部选中,点击取消全部,让所有的取消选中

    直接来看我封装的组件吧,里面的注释会解释的比较清楚

      1 <template>
      2   <div id="mySelect" :class="isAll?'isAll':''">
      3     <el-select
      4       v-model="searchSelect"
      5       multiple
      6       filterable
      7       placeholder="请选择"
      8       @change="selectChange"
      9       popper-class="cheng"
     10     >
     11       <el-option
     12         v-for="item in selectOption"
     13         :key="item.value"
     14         :label="item.label"
     15         :value="item.value"
     16       ></el-option>
     17     </el-select>
     18   </div>
     19 </template>
     20 <script>
     21 export default {
     22   name: "mySelect",
     23   data() {
     24     return {
     25       searchSelect: [], // 下拉选择框中的内容
     26       oldSearchSelect: [], // 原来的下拉框中的内容
     27       selectOption: [
     28         
     29       ],
     30       isAll:true, // 是不是全选中了
     31     };
     32   },
     33   props: {
     34     option:{ // 传输过来的数组
     35       type:Array,
     36       default:[]
     37     },
     38     label:{ // 做一个字典,显示的值
     39       type:String,
     40       default:"label"
     41     },
     42     value:{ // 做一个字典,实际的值
     43       type:String,
     44       default:"value"
     45     }
     46   },
     47   watch:{
     48     option(){
     49       if(this.option.length!=0 && this.value in this.option[0] && this.label in this.option[0]){
     50         this.selectOption.push({
     51           value: "all",
     52           label: "全部"
     53         });
     54         this.option.map(item=>{
     55           this.selectOption.push({
     56             value: item[this.value],
     57             label: item[this.label]
     58           })
     59         })
     60         this.selectOption.map(item=>{
     61           this.searchSelect.push(item.value);
     62           this.oldSearchSelect.push(item.value);
     63         })
     64       }
     65     }
     66   },
     67   mounted() {
     68     // console.log(this.opeion);
     69   },
     70   components: {},
     71   computed: {},
     72   methods: {
     73 
     74     // 下拉框选择
     75     selectChange(){
     76       // console.log(this.searchSelect);
     77       let oldIndexOfValue = this.oldSearchSelect.indexOf("all");
     78       let indexOfValue = this.searchSelect.indexOf("all");
     79       if(oldIndexOfValue!=-1 && indexOfValue!=-1){ // 两个都有ALL,则表示只是去掉了莫一项
     80         this.searchSelect.splice(indexOfValue,1);
     81         this.isAll = false;
     82         this.saveNewSearchSelect();
     83       }else if(oldIndexOfValue==-1 && indexOfValue!=-1){ // 老数据没有all,新的有的,表明需要全选
     84         this.searchSelect.splice(0);
     85         this.oldSearchSelect.splice(0);
     86         this.isAll = true;
     87         this.selectOption.map(item=>{
     88           this.searchSelect.push(item.value);
     89           this.oldSearchSelect.push(item.value);
     90         })
     91       }else if(oldIndexOfValue!=-1 && indexOfValue==-1){ // 老数据有all,但是新的数据没有all,表明需要全不选
     92         this.searchSelect.splice(0);
     93         this.oldSearchSelect.splice(0);
     94         this.isAll = false;
     95       }else if(oldIndexOfValue==-1 && indexOfValue==-1){ // 两个都没有ALL,表示只是选择了一下,需要判断是不是都选上
     96         let isAllSelected = false; 
     97         let allOption = [];
     98         this.selectOption.map(item=>{
     99           if(item.value!="all"){
    100             allOption.push(item.value);
    101           }
    102         })
    103         if(allOption.length == this.searchSelect.length){
    104           this.isAll = true;
    105           // this.searchSelect.push("all");
    106           this.searchSelect.splice(0,0,"all")
    107           this.saveNewSearchSelect();
    108         }
    109       }
    110     },
    111     // 保存原来的数据
    112     saveNewSearchSelect(){
    113       this.oldSearchSelect.splice(0);
    114       this.searchSelect.map(item=>{
    115         this.oldSearchSelect.push(item);
    116       })
    117     },
    118   }
    119 };
    120 </script>
    121 <style lang="scss">
    122 .el-select__tags{
    123   height: 26px;
    124   overflow: hidden;
    125   // text-overflow: ellipsis;
    126   &>span{
    127     white-space: nowrap;
    128     overflow: hidden;
    129     display: block;
    130   }
    131 }
    132 .el-select .el-select__tags>span{
    133   overflow: hidden;
    134   text-overflow: ellipsis;
    135   display: inline-block!important;
    136   //  70%;
    137   max- 90%;
    138 }
    139 .el-tag.el-tag--info .el-tag__close{
    140   display: none;
    141 }
    142 .isAll{
    143   .el-select .el-select__tags>span{
    144     span:nth-child(n+2){
    145       display: none;
    146     }
    147   }
    148 }
    149 
    150 </style>

    使用的方式如下

     1 import mySelect from "@/components/mySelect";
     2 
     3 components: {
     4     mySelect
     5 },
     6 
     7 <my-select ref="tenantselect" :option="tenantNameOption" :value="'value'" :label="'label'"/>
     8 
     9 //option:为所有的下拉框选项
    10 //value:为实际的 传参
    11 //label:为显示的数据
    12 
    13 // 例: 如果你的数据是这样的,var list = [{
    14 //     id:'apple',
    15 //     name:"苹果"
    16 // },{
    17 //     id:'orange',
    18 //     name:"橘子"
    19 // }]
    20 
    21 // <my-select ref="tenantselect" :option="list" :value="'id'" :label="'name'"/>
    22 // 获取现在选中的值
    23 // $refs.tenantselect.searchSelect

    其中包括,需要传输什么样的参数,然后等到什么结果。

  • 相关阅读:
    python 统计gitlab代码量
    whistle 模拟用户网络超时
    Node.js 快速转换 url 链接
    实用的 Git 命令
    前端常用 prettier 配置 + vetur 配置
    vue 项目 eslint + prettier 配置
    lodash 方法 debounce 防连点 防抖按钮点击
    npm 包实现自动登录 CICD 流程
    git push --follow-tags 命令
    小程序 iOS webview 中网页使用 iframe 无法滚动问题
  • 原文地址:https://www.cnblogs.com/daniao11417/p/14387767.html
Copyright © 2020-2023  润新知