今天小编给大家分享一下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>
以上就是“vue如何实现二级弹框”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。