vue實現二級彈框案例

本文實例為大傢分享瞭vue實現二級彈框的具體代碼,供大傢參考,具體內容如下

二級彈框案例,如下圖所示

<template>
    <div class="zw-dialog">
        <div class="zw-top">
            <p class="zw-word">請選擇職位</p>
            <div class="zw-in">
                <!-- <input class="zw-put" v-model="jobKeyWord" placeholder="請輸入職位關鍵詞" />-->
                <el-input  class="in-put" v-model="jobKeyWord"
                           @click.native="clickSearchInput"
                           clearable
                           @blur="blurSearch"
                           placeholder="請輸入職位關鍵詞"></el-input>
                <div class="in-block" v-show="searchFlag">
                    <ul class="in-ul">
                        <!--<li class="in-li" v-for="(item,i) in searchList" :key="i">{{item.nameZh}}</li>-->
                        <li class="in-li" v-for="(item,i) in searchList"
                            :key="i" @click="clickTwoCatFun(item)"
                            @mousedown= downDrag($event)
                            v-html="item.nameVal"></li>
                    </ul>
                </div>
            </div>
        </div>
        <div class="zw-middle">
          <span class="zw-tag" v-for="(item,i) in clickTwoNameArr" :key="i">
            {{item.nameZh}}
            <i class="el-icon-close" @click="delChoolseTwoItem(item)"></i>
          </span>
            <span class="zw-more">最多選擇1個職位類別</span>
            <span class="zw-sure" @click="jobSure">確認</span>
        </div>
        <div class="zw-main">
            <div class="zw-left">
                <ul class="zw-ul">
                    <!--<li class="zw-li li-active">產品/運營/新媒體 <span class="li-num">1</span></li>-->
                    <!-- <template v-for="(item,i) in jobClassList" :key="i">
                     </template>    -->
                    <li class="zw-li"
                        :class="[clickOneJobNameArr.includes(item.id) ? 'li-active' :'']"
                        v-for="(item,i) in jobClassList"
                        @click="clickJobItem(item)"
                        :key="i" >{{item.nameZh}}
                        <span class="li-num" v-if=" countObj[item.id] ">{{countObj[item.id]}}</span>
                    </li>
                </ul>
            </div>
            <div class="zw-right">
                <div class="right-main">
                    <!--<span class="job-tag job-active">互聯網/移動互聯網/電子商務</span>-->
                    <span class="job-tag"
                          :class="[clickTwoIdArr.includes(twoObj.id) ? 'job-active' :'']"
                          v-for="(twoObj,i) in clickCateObj.list"
                          :key="i" @click="clickTwoCatFun(twoObj)">{{twoObj.nameZh}}
              </span>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        name: "JobClassComp",
        data(){
            return{
                jobKeyWord:'',//職位關鍵詞
                searchFlag:false,//是否展示搜索框
                searchList:[],//搜索數據
                clickOneJobNameArr:[],//存儲點擊時一級分類
                clickTwoNameArr:[],//選中的二級分類
                clickTwoIdArr:[],//選中的二級分類
                clickCateObj:{},// 點擊選中的一級分類
                countObj:{},//二級職位被選中時 一級顯示數量
                searchDataList:[], //搜索數據
                allTwoClassList:[],//所有二級分類
            }
        },
        props:{
            form: Object,
            isEndDateNow: Boolean,
            jobClassList:{
                type:Array,
                default() {
                    return [];
                }
            }
        },
        computed: {
            listLength(){
                return this.jobClassList.length
            }
        },
        watch:{
            jobKeyWord(val){
                if(val.length >0){
                    this.searchList = this.searchDataList.filter(item =>{
                        val = val.toUpperCase();
                        let reg = new RegExp("(" + val + ")", "g");
                        let nameVal = item.nameZh.replace(reg, "<span style='color:#437FFF;'>$1</span>");
                        item.nameVal = nameVal;
                        //     return newstr;
                        return item.nameZh.includes(val)
                    })
                    this.searchFlag = true
                }else {
                    this.searchList = [];
                    this.searchFlag = false
                }

            },
            listLength(val,oldValue){
                /*  console.log("val==",val)
                  console.log("oldValue==",oldValue)*/
                if(oldValue === 0 && val >0){
                    //console.log("--22--",this.jobClassList)
                    this.clickOneJobNameArr.length ===0 ? this.clickOneJobNameArr.push(this.jobClassList[0].id ): '';
                    Object.keys(this.clickCateObj).length===0 ? this.clickCateObj = this.jobClassList[0] :'';
                    this.dealSearchData(); // 處理搜索職位數據
                  //  this.doAllTwoClassData() lzs
                }
            }
        },
        created() {
            if(this.jobClassList && this.jobClassList.length >0){
                this.clickOneJobNameArr.length ===0 ? this.clickOneJobNameArr.push(this.jobClassList[0].id ): '';
                Object.keys(this.clickCateObj).length===0 ? this.clickCateObj = this.jobClassList[0] :'';
                this.dealSearchData(); // 處理搜索職位數據
            }
        },
        methods:{
            clickSearchInput(){
                this.jobKeyWord.length > 0 ? this.searchFlag = true : this.searchFlag=false;
            },
            //input失去焦點
            blurSearch(){
                this.searchFlag = false;
            },
            downDrag(el){
                el.preventDefault();//阻止input失去焦點事件時的影響
            },
            //職位確認
            jobSure(){
               // this.dialogVisible = false; //add lzs
                if(this.clickTwoNameArr.length >0){
                    this.form.jobIntensionName = '';
                    this.clickTwoNameArr.forEach(item =>{
                        this.form.jobIntensionName = this.form.jobIntensionName + ',' + item.nameZh ;
                    })
                    this.form.jobIntensionName.length > 0 ? this.form.jobIntensionName = this.form.jobIntensionName.substring(1,this.form.jobIntensionName.length) :'';
                }else {
                    this.form.jobIntensionName = '';
                }
                this.$emit('sureJobMethod',this.clickTwoNameArr)
            },
            clickJobItem(item){//點擊職位類別
                //console.log("item----",item)
                this.clickCateObj =item;
                //處理選中 顏色變化
                if(this.clickOneJobNameArr.length >0){
                    this.clickOneJobNameArr.splice(0, 1);
                    this.clickOneJobNameArr.push(item.id)
                }else{
                    this.clickOneJobNameArr.push(item.id)
                }
            },
            //點擊二級職位名稱
            clickTwoCatFun(obj){
                //type: search two; =search是點擊的搜索框出現,否則就是點擊的二級
                // type === 'search' ? this.jobKeyWord = obj.nameZh : '';
                if(!this.clickTwoIdArr.includes(obj.id) && this.clickTwoIdArr.length ===1 ){
                    this.$message({
                        message: '最多選擇1個職位類別哦',
                        type: 'warning'
                    });
                    return
                }
                if(!this.clickTwoIdArr.includes(obj.id) && this.clickTwoIdArr.length<3){
                    this.clickTwoNameArr.push(obj)
                    this.clickTwoIdArr.push(obj.id)
                    this.form.jobIntensionNameSel.push(obj.id)
                    if(!this.countObj[obj.parentId]){
                        this.countObj[obj.parentId] = 1
                    }else {
                        this.countObj[obj.parentId]++;
                    }
                }
            },
            //要刪除的二級分類,改變選中顏色,改變一級分類統計數量
            delChoolseTwoItem(delObj){
                // var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; });
                let index = this.clickTwoNameArr.findIndex(item =>{
                    return item.id === delObj.id
                })
                let formIndex = this.form.jobIntensionNameSel.findIndex(idVal =>{
                    return idVal === delObj.id
                })
                this.form.jobIntensionNameSel.splice(formIndex, 1)//刪除
                this.clickTwoNameArr.splice(index, 1)
                this.clickTwoIdArr.splice(index, 1)
                if(!this.countObj[delObj.parentId]){
                    this.countObj[delObj.parentId] = 0
                }else {
                    this.countObj[delObj.parentId]--;
                }
            },
            //處理搜索的數據
            dealSearchData(){
                this.jobClassList.forEach(item =>{
                    this.searchDataList = this.searchDataList.concat(item.list)
                })
            },

        }
    }
</script>

<style scoped lang="less">
    .zw-dialog{
        /*  border: 1px solid red;*/
        width:880px;
        height:550px;
        background:rgba(255,255,255,1);

        .zw-top{
            height: 52px;
            width: 100%;
            display: flex;
            /*border: 1px solid green;*/
            border-bottom: 1px solid #EFEFEF ;
            .zw-word{
                width: 200px;
                /* text-align: center;*/
                margin-left: 30px;
                line-height: 52px;
                font-size: 16px;
                color: #333333;
            }
            .zw-in{
                /* border: 1px solid blue;*/
                width: calc(100% - 200px);
                line-height: 52px;
                .zw-put{
                    border-radius:15px;
                    border:1px solid rgba(224,224,224,1);
                    width: 200px;
                    height: 30px;
                    margin-left: 32px;
                    font-size: 12px;
                    padding-left: 20px;
                }
                .in-put{
                    width: 200px;
                    height: 30px;
                    /deep/ .el-input__inner{
                        border-radius:15px;
                        color: #999999;
                        font-size: 12px;
                    }
                    /deep/ input::-webkit-input-placeholder {
                        /* WebKit browsers */
                        font-size: 12px;
                        color: #999999;
                    }
                    /deep/ input:-moz-placeholder{
                        /* Mozilla Firefox 4 to 18 */
                        font-size: 12px;
                        color: #999999;
                    }
                    /deep/ input::-moz-placeholder{
                        /* Mozilla Firefox 19+ */
                        font-size: 12px;
                        color: #999999;
                    }
                    /deep/ input:-ms-input-placeholder{
                        font-size: 12px;
                        color: #999999;
                    }
                }
                .in-block{
                    width: 200px;
                    height: 290px;
                    z-index: 11;
                    box-shadow:0px 2px 12px 0px rgba(0,0,0,0.06);
                    position: relative;
                    background: #ffffff;
                    overflow: scroll;

                    .in-ul{
                        padding:5px 0px;
                        .in-li{
                            color: #000000;
                            padding: 10px 20px;
                            line-height: 20px;
                            font-size: 14px;
                            &:hover{
                                cursor: pointer;
                                background: #F7F9FD;
                            }

                        }
                    }
                }


            }
        }
        .zw-middle{
            /*width: 100%;*/
            height: 50px;
            /*  border: 1px solid green;*/
            display: flex;
            align-items: center;
            padding-left: 30px;
            .zw-tag{
                display: inline-block;
                border-radius:15px;
                border:1px solid rgba(67,127,255,1);
                padding: 5px 12px 5px 10px;
                margin-right: 16px;
                font-size:13px;
                color: #437FFF;

                i{
                    cursor: pointer;
                    padding-left: 4px;
                }
            }
            .zw-more{
                color: #CCCCCC;
                font-size:13px;
            }
            .zw-sure{
                display: inline-block;
                width: 72px;
                height: 28px;
                line-height: 28px;
                text-align: center;
                background:rgba(67,127,255,1);
                border-radius:15px;
                font-size:13px;
                color: #ffffff;
                position: absolute;
                right: 30px;
                &:hover{
                    cursor: pointer;
                }
            }
        }
        .zw-main{
            display: flex;
            .zw-left{
                width: 200px;
                height: 443px;
                overflow: scroll;
                /*border: 1px solid red;*/
                .zw-ul{
                    background:rgba(249,250,251,1);
                    .zw-li{
                        height: 50px;
                        /* line-height: 50px;*/
                        text-align: center;
                        align-items: center;
                        display: flex;
                        justify-content: center;
                        border-left: 4px solid transparent;
                        &:hover{
                            cursor: pointer;
                        }
                        /*border: 1px solid pink;*/
                        .li-num{
                            display: inline-block;
                            background: #437FFF;
                            width: 16px;
                            height: 16px;
                            line-height: 16px;
                            border-radius: 50%;
                            font-size:13px;
                            color:#ffffff;
                            margin-left: 8px;
                        }
                    }
                    .li-active{
                        border-left: 4px solid #437FFF;
                        background:rgba(255,255,255,1);
                    }
                }
            }
            .zw-right{
                /*border: 1px solid black;*/

                width: calc(100% - 200px);
                height: 443px;
                overflow: scroll;
                .right-main{

                    .job-tag{
                        display: inline-block;
                        margin: 16px 20px;
                        width: 182px;
                        font-size:14px;
                        color: #444444;
                        &:hover{
                            cursor: pointer;
                        }
                    }
                    .job-active{
                        color: #437FFF;
                    }
                }
            }

        }
    }
</style>

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: