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>
|