zoukankan      html  css  js  c++  java
  • 自己封装一个下拉列表

    // html:

    <header> <oSelect @changeOption="onChangeOption" :selectData="selectData"></oSelect> </header>
    data(){
        selectData: {
                  defaultIndex: 0,//默认选中是第几个
                  selectStatus: false,//通过这个来控制下拉框的显示和隐藏
                  selectOptions: []//下拉框中的数据
         },
    }
    
    onChangeOption(index, id,houseName) {
                //header 选择下拉的列表
                this.selectData.defaultIndex = index ;
                this.houseId = id ;
                this.houseName = houseName ;
    },
     created(){
              const that = this ;
           this.postRequest('', {}, function (data) {    // 此请求的封装方式,请查看上上一篇axios的封装
                that.houseId = data[0].projectId ;         // 初始化默认第一个
                that.houseName = data[0].projectName ;
                let arr = [] ;
                data.forEach((val)=>{
                arr.push({
                  'houseId':val.projectId,
                  'houseName':val.projectName
                })
                })
                that.selectData.selectOptions = arr
              })
            },


    // 封装oSelect组件
    <template>
      <div>
        <div class="select-box" @click="changeStatus">
          <h5 class="select-title"  v-if="selectData.selectOptions.length>0" :name="selectData.selectOptions[selectData.defaultIndex].houseName" :class="{'select-title-active': selectData.selectStatus}">
            {{selectData.selectOptions[selectData.defaultIndex].houseName }}
          </h5>
          <transition name="slide-down">
            <ul class="select-options" v-show="selectData.selectStatus">
              <li class="select-option-item" v-for="(item,index) in selectData.selectOptions" @click="emitOption(index,item.houseId,item.houseName,item.accountCode,item.sysUrl,item.pkHouse)" :class="{'select-option-active':selectData.defaultIndex===index}">
                {{ item.houseName }}
              </li>
              <div class="arrow-top"></div>
            </ul>
          </transition>
        </div>
      </div>
    </template>
    
    <script>
      export default{
        name:'oSelect',
        props:{
          selectData:{
            type:Object,
            default:function () {
              return {}
            }
          }
        },
        methods:{
          emitOption(index,id,name,accountCode,sysUrl,pkHouse){
            this.$emit('changeOption',index,id,name,accountCode,sysUrl,pkHouse);
    //                console.log(index)
          },
          changeStatus(){
            this.selectData.selectStatus=!this.selectData.selectStatus
          }
        }
      }
    </script>
    
    <style>
      .select-box{
        position: relative;
        /*max- 250px;*/
        100%;
        line-height: 55px;
        /*margin: 50px auto;*/
        /*border-bottom:1px solid #d8dce5;*/
      }
      .select-title{
        position: relative;
        padding: 0 30px 0 10px;
        /*border: 1px solid #d8dce5;*/
        border-radius: 5px;
        transition-duration: 500ms;
        cursor: pointer;
        font-size:32px;
        font-weight: 400;
        color:#333;
        text-align: left;
      }
      /*向下的三角*/
      .select-title:after{
        content: '';
        position: absolute;
        height: 0;
         0;
        border-top: 16px solid #d70b19;
        border-left: 16px solid transparent;
        border-right: 16px solid transparent;
        right: 9px;
        top: 0;
        bottom: 0;
        margin: auto;
        transition-duration: 500ms;
        transition-timing-function: ease-in-out;
      }
      .select-title-active{
        border-color: #409eff;
      }
      /*先向上的箭头*/
      .select-title-active:after{
        transform: rotate(-180deg);
        border-top-color: #d70b19;
      }
      .select-options{
        position: absolute;
        /*padding:10px 0;*/
        /*top: 85px;*/
        border:1px solid #d8dce5;
         100%;
        border-radius: 5px;
        /*将整个ul的背景颜色变成白色*/
        background-color:#fff;
        box-shadow: 1px 4px 2px 2px #cdcdcd;
        z-index: 999;
      }
      .select-option-item{
        padding:0 10px;
        cursor: pointer;
        transition-duration: 300ms;
        text-align: left;
        color:#999;
      }
      .select-option-item:hover,.select-option-active{
        background: #f1f1f1;
        /*color: #409eff;
        */
        color: #d70b19;
      }
      /*箭头css*/
      .arrow-top{
        /*position: absolute;
        height: 0;
         0;
        /*top: -7px;*/
        /*border-bottom: 20px solid #409eff;*/
        /*#d8dce5*/
        /*border-left: 20px solid transparent;*/
        /*/*border-right: 20px solid transparent;*/
        /*left: 0;
        right: 0;*/
        /*margin: auto;
        z-index: 99;*/
      }
      /*点击之后的向上的三角*/
      /*.arrow-top:after{
       content: '';
       position: absolute;
       display: block;
       height: 0;
        0;
       border-bottom: 20px solid #409eff;
       border-left: 20px solid transparent;
       border-right: 20px solid transparent;
       right: 5px;
       top: -55px;
       z-index: 99;
      }*/
      /*下拉框显示隐藏动画*/
      .slide-down-enter-active,.slide-down-leave{
        transition: all .3s ease-in-out;
        transform-origin:0 top;
        transform: scaleY(1);
      }
      .slide-down-enter{
        transform: scaleY(0);
      }
      .slide-down-leave-active{
        transition: all .3s ease-in-out;
        transform-origin:0 top;
        transform: scaleY(0);
      }
    </style>
    
    
    
    效果: 
    
    
  • 相关阅读:
    线程同步-使用CountDownEvent类
    WPF 依赖属性和附加属性
    ef core
    Razor语法
    python-爬虫
    ftp
    泛型
    结对编程作业
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/panax/p/10960527.html
Copyright © 2011-2022 走看看