<template> <view class="pop-view" v-if='visible'> <view class="pop-maskView" :style="{ 'background-color': maskBgColor, zIndex: zIndex - 1 }" @tap.stop="handleMaskTap" @touchmove.stop.prevent="moveHandle"> </view> <view :class="['pop-contentView',containerVisible ? 'pop-contentView-show' : '']" :style="{zIndex: zIndex}" @touchmove.stop.prevent="moveHandle"> <view class="content"> <view class="content_top"> <view class="content_left"> <view class="content_item" @click="type(1)" :style="{background:tab==1?'#f8f8f8':'transparent'}"> 城市 </view> <view class="content_item" @click="type(2)" :style="{background:tab==2?'#f8f8f8':'transparent'}"> 类型 </view> </view> <view class="content_right"> <view class="content_city" v-if="tab==1"> <scroll-view scroll-y="true" class="city_province"> <view class="province_item" v-for="(item1,index1) in region" :key='index1.id' @click="chooceProvince(item1)" :style="{'color':provinceId==item1.id?color1:'#999999','background':provinceId==item1.id?'#FFFFFF':'transparent'}"> {{item1.name}} </view> </scroll-view> <scroll-view scroll-y="true" class="city_town"> <view class="city_item" v-for="(item2,index2) in cities" :key='item2.id' @click="chooseCity(item2)" :style="{'color':cityId==item2.id?color1:'#999999'}"> {{item2.name}} </view> </scroll-view> </view> <view class="content_type" v-if="tab==2"> <view class="content_type_item" v-for="(item,index) in types" :key='item.id' @click="typeChooce(item)" :style='{color:currentType==item.id?color1:"#999999"}'> {{item.name}} </view> </view> </view> </view> <view class="bottom"> <view class="reset" @click="reset"> 重置 </view> <view class="confirm" @click="confirm"> 确定 </view> </view> </view> </view> </view> </template> <script> let region = require('@/static/region.json'); export default { props: { title: String, maskColor: { type: String, default: 'rgba(0, 0, 0, 0.3)' }, zIndex: { type: Number, default: 999 }, maskTapHide: { type: Boolean, default: true }, isShowTitle: { type: Boolean, default: true }, isShowClose: { type: Boolean, default: true }, isShowConfirm: { type: Boolean, default: true }, isScannerOption:{ type:Boolean, default:false }, marginSize:{ type: String, default: '20rpx' }, }, data() { return { visible: false, containerVisible: false, maskBgColor: '', selectValue: [0], selIdx: 0, color2:'', color1:'', tab:1, types:[], currentType:"", region:[], cities:[], province:"", provinceId:"", city:"", cityId:"", typeName:"", } }, mounted() { let app = getApp(); this.globalData = app.globalData; this.color2 = this.globalData.color2; this.color1 = this.globalData.color1; this.region = region; this.cities = region[0].children; }, methods: { async queryCategoryBox(){ let res = await this.$myRequest({ url: "/task/queryCategoryBox", data: { whetherBox: false } }) if(res.data.success){ this.types = res.data.list||[]; } }, setOptionType(option){ this.tab = option; }, show() { this.visible = true setTimeout(() => { this.maskBgColor = this.maskColor this.containerVisible = true }, 20) console.log("regin",region) this.queryCategoryBox(); }, hide() { this.maskBgColor = '' this.containerVisible = false this.visible = false this.$emit('close') }, handleCancel() { this.hide() }, handleConfirm() { this.hide() this.$emit('confirm') }, handleMaskTap() { if (this.maskTapHide) { this.hide() } }, moveHandle() {}, type(tab){ this.tab = tab; }, typeChooce(item){ this.currentType = item.id; this.typeName = item.name; }, chooceProvince(item){ this.cities = item.children; this.province = item.name; this.provinceId = item.id; }, chooseCity(item){ this.city = item.name; this.cityId = item.id; }, reset(){ this.city = ""; this.cityId = ""; this.province = ""; this.provinceId = ""; this.currentType = ""; this.typeName = ""; }, confirm(){ let param = { type:this.currentType, typeName:this.typeName, city:this.city, } this.$emit('chooiceType',param) this.handleConfirm() } } } </script> <style scoped lang="scss"> .pop-view { position: relative; .pop-maskView { position: fixed; top: 0; right: 0; left: 0; bottom: 0; } .pop-contentView { position: fixed; left: 0; right: 0; top: 0; overflow-y: scroll; background-color: #fff; display: flex; flex-direction: column; align-items: center; .pop-title { margin-top: 60rpx; font-size: 32rpx; font-family: Verdana, Verdana-Bold; font-weight: 700; text-align: center; color: #333333; } .pop-close { position: absolute; top: 64rpx; right: 30rpx; width: 40rpx; height: 40rpx; } .pop-commit { margin-bottom: 54rpx; width: 260rpx; height: 84rpx; line-height: 84rpx; border-radius: 42rpx; font-size: 32rpx; font-family: Verdana, Verdana-Regular; font-weight: 400; text-align: center; color: #ffffff; } } .pop-contentView-show { } .content{ width: 100%; .content_top{ width: 100%; height: 470rpx; display: flex; .content_left{ width: 140rpx; height: 470rpx; background: #f0f1f2; padding-top: 50rpx; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; .content_item{ width: 140rpx; height: 60rpx; line-height: 60rpx; text-align: center; font-size: 28rpx; font-family: Verdana, Verdana-Regular; font-weight: 400; color: #666666; margin-bottom: 20rpx; } } .content_right{ box-sizing: border-box; height: 100%; .content_city{ display: flex; height: 100%; box-sizing: border-box; .city_province{ width: 280rpx; min-width: 280rpx; height: 100%; box-sizing: border-box; padding-top: 50rpx; background: #f8f8f8; overflow: hidden; overflow-y: scroll; .province_item{ width: 280rpx; line-height: 60rpx; text-align: center; font-size: 28rpx; font-family: Verdana, Verdana-Regular; font-weight: 400; color: #999999; } } .city_town{ overflow-y: scroll; padding-top: 50rpx; box-sizing: border-box; .city_item{ width: 300rpx; line-height: 60rpx; font-size: 28rpx; font-family: Verdana, Verdana-Regular; font-weight: 400; text-align: center; color: #999999; } } } .content_type{ padding-top: 40rpx; padding-left: 60rpx; box-sizing: border-box; .content_type_item{ line-height: 75rpx; text-align: center; font-size: 28rpx; font-family: Verdana, Verdana-Regular; font-weight: 400; color: #999999; } } } } .bottom{ width: 100%; height: 140rpx; background: #ffffff; display: flex; justify-content: center; align-items: center; .reset{ width: 156rpx; height: 80rpx; line-height: 80rpx; background: #f8f8f8; border-radius: 40rpx; font-size: 28rpx; font-family: Verdana, Verdana-Bold; font-weight: 700; text-align: center; color: #f07423; } .confirm{ width: 444rpx; height: 80rpx; line-height: 80rpx; background: #f07423; border-radius: 40rpx; font-size: 28rpx; font-family: Verdana, Verdana-Bold; font-weight: 700; text-align: center; color: #ffffff; margin-left: 30rpx; } } } } </style>