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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue组件实现弹出框点击显示隐藏效果

    本文实例为大家分享了vue实现弹出框点击显示隐藏的具体代码,供大家参考,具体内容如下 效果如下图 由于我的更改密码弹出框是一个组件引用的,所以在一开始是隐藏的,这就需要在当前的页面上对弹出框组件设置v-show,但是在弹出框显示出来的时候,操作执行完后当前页面的更改按钮已经被弹出框覆盖了.所以只能在弹出页面点击取消实现关闭隐藏弹出框.这样就需要写两个点击事件,但是两个点击事件就会有冲突,需要点击两下才能使弹出框显示和隐藏.然后我就用的以下方法,希望可以帮到大家!!! 代码如下 1.在当前页面中(

  • vue自定义弹框效果(确认框、提示框)

    本文实例为大家分享了vue自定义弹框效果的具体代码,供大家参考,具体内容如下 1.自定义确认框和提示框 根据传入的type来判断是确认框或提示框 <template> <transition name="confirm-fade"> <div v-if="isShowConfirm" class="my-confirm" @click.stop="clickFun('clickCancel')"&

  • vue+elementui实现点击table中的单元格触发事件--弹框

    elementui中提供了点击行处理事件 查看位置: elementui的table事件 elementui的table中怎样点击某个单元格触发事件? 可以先看一下官网中table的自定义列模板代码 <template> <el-table :data="tableData" border style="width: 100%"> <el-table-column label="日期" width="180

  • Vue.js弹出模态框组件开发的示例代码

    前言 在开发项目的过程中,经常会需要开发一些弹出框效果,但原生的alert和confirm往往都无法满足项目的要求.这次在开发基于Vue.js的读书WebApp的时候总共有两处需要进行提示的地方,因为一开始就没有引入其他的组件库,现在只好自己写一个模态框组件了.目前只是一个仅满足当前项目需求的初始版本,因为这个项目比较简单,也就没有保留很多的扩展功能.这个组件还是有很多扩展空间的,可以增加更多的自定义内容和样式.这里只介绍如何去开发一个模态框组件,有需要进行更多扩展的,可以根据自己的需求自行开发

  • 使用vue实现各类弹出框组件

    简单介绍一下vue中常用dialog组件的封装: 实现动态传入内容,实现取消,确认等回调函数. 首先写一个基本的弹窗样式,如上图所示. 在需要用到弹窗的地方中引入组件: import dialogBar from './dialog.vue' components:{ 'dialog-bar': dialogBar, }, <dialog-bar></dialog-bar> 点击一个按钮显示弹窗,并保证关闭弹窗后再次点击依旧显示 在弹窗组件中定义一个value值:v-model=&

  • vue教程之toast弹框全局调用示例详解

    本文实例为大家分享了vue toast弹框全局调用示例,供大家参考,具体内容如下 1.首选新建一个toast.vue模板文件: <template> <transition :name="fadeIn"> <div class="alertBox" v-show="show"> <div class="alert-mask" v-show="isShowMask"&

  • vue实现点击出现操作弹出框的示例

    如上图所示,这次要实现一个点击出现操作弹框的效果:并将这个功能封装成一个函数,便于在项目的多个地方使用. 具体思路是: 封装一个组件,组件保护一个插槽,我们可以根据不同的场景,利用插槽随意在这个弹框里插入任何元素,这个弹框显示时根据我鼠标的点击位置,定位弹窗的位置,并在组件里面监听鼠标抬起事件,触发事件时将弹窗隐藏: 接着在函数中利用createElement和appendChild方法将弹出框创建并插入到页面中:   本次实现基于vuecli3 接下来,具体实现: 首先,我们先写一个demo组

  • elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo

    调试了好久, 还能凑合用, 请直接看DOME 示例,复制就能用: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- import CSS --> <link rel="stylesheet" href="https://u

  • 详解用vue编写弹出框组件

    前言 最近研究了用vue编写弹出框的组件,发现其实这里面的门道还是有很多的.这篇文完全是用来记录总结下最近的学习成果,同时也希望能够帮得上正在学习纠结的你~ps:本文假设你已经了解vue2.0相关框架,因此适合有一定vue2.0基础的同学阅读. 设计组件的思考 其实单纯的编写一个弹出框组件并不难,写一个模板,然后用v-if或者v-show指令还控制组件的出现与消失.真正困扰我的是,这个组件的调用方式,这个问题纠结了我好久. 调研了下资料,有些人建议,直接把组件标签插进模板中,然后通过直接控制组件

  • vue.js中toast用法及使用toast弹框的实例代码

    1.首先引入 import { Toast } from 'vant' 写个小列子 绑定一个click事件 2.写事件 在methods写方法 showToast() { this.$toast({ message: "今日签到+3", }) }, 3.效果图如下 一个简单的toast提示成就好了 下面通过实例代码看下vue 中使用 Toast弹框 import { ToastPlugin,ConfirmPlugin,AlertPlugin} from 'vux' Vue.use(To

随机推荐