259 lines
5.8 KiB
Vue
259 lines
5.8 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="content">
|
|||
|
|
<view class="data-info">选择内容为:{{cityName}}</view>
|
|||
|
|
<view class="text-area">
|
|||
|
|
<view class="">数据类型(可选):</view>
|
|||
|
|
<view :class="level == item.id ? 'level-single-active' : 'level-single'" @tap="switchLevel(item.id)"
|
|||
|
|
v-for="(item,index) in levelList" :key="index">{{item.name}}</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="text-area">
|
|||
|
|
<view class="">弹框标题(可改):</view>
|
|||
|
|
<input type="text" v-model="title" />
|
|||
|
|
</view>
|
|||
|
|
<view class="text-area">
|
|||
|
|
<view class="">最多数量(可改):</view>
|
|||
|
|
<input type="number" v-model.number="maxCount" />
|
|||
|
|
<text>个</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="text-area">
|
|||
|
|
<view class="">弹框颜色(可改):</view>
|
|||
|
|
<input type="text" v-model="colorValue" />
|
|||
|
|
</view>
|
|||
|
|
<view class="show-btn" @tap="show">点击显示11</view>
|
|||
|
|
<uni-popup ref="cityMore" type="bottom">
|
|||
|
|
<more-select :cityData="cityData" @chooseCity="chooseCity" @switchCity="switchCity" :cityIndex="cityIndex"
|
|||
|
|
@scrollCity="scrollCity" @closeCity="closeCity" @queryCity="queryCity" :oldScrollTop="oldScrollTop"
|
|||
|
|
:scrollTop="scrollTop" :chooseCityList="chooseCityList" :title="title" :cityIdArr="cityIdArr" @delCity="delCity"
|
|||
|
|
ref="moreselects" :maxCount="maxCount" :level="level" :colorValue="colorValue"></more-select>
|
|||
|
|
</uni-popup>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import cityData from '@/common/data.js'; //多级数据
|
|||
|
|
import LevelOneData from '@/common/levelone-data.js' //一级数据
|
|||
|
|
import moreSelect from "@/components/more-select.vue"
|
|||
|
|
export default {
|
|||
|
|
components: {
|
|||
|
|
moreSelect
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
level: 2,
|
|||
|
|
title: '选择城市',
|
|||
|
|
chooseCityList: [],
|
|||
|
|
cityIdArr: [],
|
|||
|
|
cityData: "",
|
|||
|
|
scrollTop: 0,
|
|||
|
|
oldScrollTop: 0,
|
|||
|
|
cityIndex: 0,
|
|||
|
|
maxCount: 3,
|
|||
|
|
cityName: "",
|
|||
|
|
colorValue: "#016CE1",
|
|||
|
|
levelList: [{
|
|||
|
|
"id": 1,
|
|||
|
|
"name": "一级多选",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": 2,
|
|||
|
|
"name": "二级多选"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": 3,
|
|||
|
|
"name": "三级多选"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onLoad() {
|
|||
|
|
//定时器模拟ajax异步请求数据
|
|||
|
|
setTimeout(() => {
|
|||
|
|
this.cityData = cityData;
|
|||
|
|
}, 100);
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
show() {
|
|||
|
|
console.log(this.level)
|
|||
|
|
if (this.level == 1) {
|
|||
|
|
this.cityData = LevelOneData
|
|||
|
|
} else {
|
|||
|
|
this.cityData = cityData
|
|||
|
|
}
|
|||
|
|
this.$refs.cityMore.open()
|
|||
|
|
},
|
|||
|
|
switchLevel(id) {
|
|||
|
|
this.resetData()
|
|||
|
|
this.level = id
|
|||
|
|
},
|
|||
|
|
resetData(){
|
|||
|
|
this.cityIdArr = []
|
|||
|
|
this.chooseCityList = []
|
|||
|
|
},
|
|||
|
|
delCity(delId) {
|
|||
|
|
this.cityIdArr.forEach((item, index) => {
|
|||
|
|
if (this.chooseCityList[delId].id == item) {
|
|||
|
|
this.cityIdArr.splice(index, 1);
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
this.chooseCityList.splice(delId, 1);
|
|||
|
|
this.$nextTick(() => {
|
|||
|
|
this.$refs.moreselects.getViewHeight();
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
chooseCity(item) {
|
|||
|
|
console.log(item)
|
|||
|
|
console.log(this.cityIdArr)
|
|||
|
|
//先判断Id是否在数组中
|
|||
|
|
if (this.cityIdArr.includes(item.id)) {
|
|||
|
|
this.chooseCityList.forEach((val, key) => {
|
|||
|
|
if (val.id == item.id) { //如果在数组中,反选(删除)
|
|||
|
|
this.delCity(key)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (this.chooseCityList.length >= this.maxCount) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '最多选择' + this.maxCount + '个',
|
|||
|
|
icon: "none",
|
|||
|
|
duration: 2000
|
|||
|
|
});
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
let obj = {}
|
|||
|
|
if (this.level == 1) {
|
|||
|
|
obj = {
|
|||
|
|
"id": item.id,
|
|||
|
|
"name": item.name
|
|||
|
|
}
|
|||
|
|
}else if(this.level == 2){
|
|||
|
|
obj = {
|
|||
|
|
"id": item.id,
|
|||
|
|
"name": item.parentName + item.name,
|
|||
|
|
"pid": item.pid,
|
|||
|
|
"pname": item.parentName
|
|||
|
|
}
|
|||
|
|
}else if(this.level == 3){
|
|||
|
|
console.log(item)
|
|||
|
|
obj = {
|
|||
|
|
"id": item.id,
|
|||
|
|
"name": item.oneName + item.twoName + item.name,
|
|||
|
|
"oneId": item.oneId,
|
|||
|
|
"twoId": item.twoId,
|
|||
|
|
"oneName": item.oneName,
|
|||
|
|
"twoName": item.twoName,
|
|||
|
|
"threeName": item.name
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.cityIdArr.push(item.id)
|
|||
|
|
this.chooseCityList.push(obj)
|
|||
|
|
//调用子组件方法动态改变滚动栏高度
|
|||
|
|
this.$nextTick(() => {
|
|||
|
|
this.$refs.moreselects.getViewHeight();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
switchCity(index) {
|
|||
|
|
this.scrollTop = this.oldScrollTop
|
|||
|
|
//当视图渲染结束 重新设置为0
|
|||
|
|
this.$nextTick(() => {
|
|||
|
|
this.scrollTop = 0
|
|||
|
|
});
|
|||
|
|
this.cityIndex = index
|
|||
|
|
},
|
|||
|
|
scrollCity(val) {
|
|||
|
|
//记录scroll 位置
|
|||
|
|
this.oldScrollTop = val
|
|||
|
|
},
|
|||
|
|
closeCity() {
|
|||
|
|
this.$refs.cityMore.close()
|
|||
|
|
},
|
|||
|
|
queryCity() {
|
|||
|
|
this.cityName = ""
|
|||
|
|
this.chooseCityList.forEach((item, index) => {
|
|||
|
|
this.cityName += item.name + ","
|
|||
|
|
})
|
|||
|
|
this.cityName = this.cityName.substring(0, this.cityName.lastIndexOf(','));
|
|||
|
|
this.$refs.cityMore.close()
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss">
|
|||
|
|
:deep(::-webkit-scrollbar ){
|
|||
|
|
display: none;
|
|||
|
|
width: 0 !important;
|
|||
|
|
height: 0 !important;
|
|||
|
|
-webkit-appearance: none;
|
|||
|
|
background: transparent;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.show-btn {
|
|||
|
|
width: 700upx;
|
|||
|
|
height: 104upx;
|
|||
|
|
border-radius: 14upx;
|
|||
|
|
background: #286FFF;
|
|||
|
|
font-size: 36upx;
|
|||
|
|
font-family: Source Han Sans CN;
|
|||
|
|
font-weight: 500;
|
|||
|
|
color: #FFFFFF;
|
|||
|
|
line-height: 104upx;
|
|||
|
|
text-align: center;
|
|||
|
|
margin: 0upx auto;
|
|||
|
|
margin-top: 50upx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.data-info {
|
|||
|
|
width: 700upx;
|
|||
|
|
font-weight: bold;
|
|||
|
|
|
|||
|
|
margin: 20upx auto;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.logo {
|
|||
|
|
height: 200rpx;
|
|||
|
|
width: 200rpx;
|
|||
|
|
margin-top: 200rpx;
|
|||
|
|
margin-left: auto;
|
|||
|
|
margin-right: auto;
|
|||
|
|
margin-bottom: 50rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.level-single {
|
|||
|
|
background: #EEEEEE;
|
|||
|
|
margin-right: 10upx;
|
|||
|
|
border-radius: 14upx;
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
padding: 10upx 20upx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.level-single-active {
|
|||
|
|
background: #016CE1;
|
|||
|
|
margin-right: 10upx;
|
|||
|
|
border-radius: 14upx;
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #FFFFFF;
|
|||
|
|
padding: 10upx 20upx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.text-area {
|
|||
|
|
width: 700upx;
|
|||
|
|
margin: 20upx auto;
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
input{
|
|||
|
|
width: 300upx;
|
|||
|
|
font-weight: bold;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.title {
|
|||
|
|
font-size: 36rpx;
|
|||
|
|
color: #8f8f94;
|
|||
|
|
}
|
|||
|
|
</style>
|