211 lines
5.3 KiB
Vue
211 lines
5.3 KiB
Vue
<template>
|
||
<view style="background-color: white;padding: 5rpx;">
|
||
<view class="center">
|
||
<view style="margin-right: 20rpx;">
|
||
{{label}}:
|
||
</view>
|
||
<uni-easyinput style="padding: 5rpx;" @focus="open" trim="all" v-model="selctValue"
|
||
placeholder="请选择"></uni-easyinput>
|
||
</view>
|
||
<uni-popup ref="popup" type="bottom">
|
||
<view style="height: 60vh;background-color: white;padding: 20rpx;padding-top: 40rpx;">
|
||
<uni-row>
|
||
<uni-col :span="4" :offset="0">
|
||
<view class="demo-uni-col center">
|
||
<span @click.stop="cancle" style="color: rgba(69, 90, 100, 0.6);">
|
||
取 消
|
||
</span>
|
||
</view>
|
||
</uni-col>
|
||
<uni-col :span="14" :offset="1">
|
||
<view class="center" v-if="filterable">
|
||
<uni-easyinput v-model="search" focus placeholder="输入关键字过滤"
|
||
@input="inputChange"></uni-easyinput>
|
||
</view>
|
||
|
||
</uni-col>
|
||
<uni-col :span="4" :offset="filterable ?1:15">
|
||
<view class="demo-uni-col center" @click="confirm" style="color: #576b95;">确 认</view>
|
||
</uni-col>
|
||
</uni-row>
|
||
<uni-row>
|
||
<uni-col :span="8">
|
||
<view class="">
|
||
<picker-view @change="bindChange" class="picker-view">
|
||
<!-- 省 -->
|
||
<picker-view-column>
|
||
<view class="center" v-for="(item,index) in provinces" :key="Math.random()">
|
||
{{item.value}}
|
||
</view>
|
||
</picker-view-column>
|
||
<!-- 市 -->
|
||
<picker-view-column>
|
||
<view class="center" v-for="(item,index) in cities" :key="Math.random()">
|
||
{{item.value}}
|
||
</view>
|
||
</picker-view-column>
|
||
区县
|
||
<picker-view-column>
|
||
<view class="center" v-for="(item,index) in counties" :key="Math.random()">
|
||
{{item.value}}
|
||
</view>
|
||
</picker-view-column>
|
||
</picker-view>
|
||
</view>
|
||
</uni-col>
|
||
</uni-row>
|
||
</view>
|
||
</uni-popup>
|
||
</view>
|
||
</template>
|
||
<script>
|
||
import area from './area.js'
|
||
export default {
|
||
props: {
|
||
label: {
|
||
default: '标签'
|
||
},
|
||
filterable: {
|
||
default: false,
|
||
type: Boolean
|
||
},
|
||
treeArr: {
|
||
default: function() {
|
||
return area
|
||
},
|
||
type: Array
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
//---
|
||
selctValue: '',
|
||
//
|
||
popupVisible: true,
|
||
title: 'picker-view',
|
||
filterpickeArr: [],
|
||
visible: true,
|
||
//搜索框---
|
||
search: '',
|
||
//滚动框的值
|
||
pickeValue: '',
|
||
// 省市县数据
|
||
provinces: [],
|
||
cities: [],
|
||
counties: [],
|
||
selectProvince: '',
|
||
selectCity: '',
|
||
selectCounty: '',
|
||
}
|
||
},
|
||
mounted() {
|
||
this.filterpickeArr = [...this.treeArr]
|
||
this.resetArr()
|
||
},
|
||
methods: {
|
||
//恢复 下拉数据/搜索数据/选中数据
|
||
resetArr() {
|
||
this.provinces = [...this.treeArr]
|
||
this.cities = [...this.provinces[0].children]
|
||
this.counties = [...this.cities[0].children]
|
||
this.selectProvince = this.provinces[0]
|
||
this.selectCity = this.cities[0]
|
||
this.selectCounty = this.counties[0]
|
||
//搜索项
|
||
this.search = ''
|
||
},
|
||
//表单项
|
||
open() {
|
||
// 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center']
|
||
this.$refs.popup.open('bottom')
|
||
this.resetArr()
|
||
},
|
||
//弹出框---
|
||
// 输入框
|
||
inputChange(val) {
|
||
this.filter(val)
|
||
},
|
||
//过滤
|
||
filter(val) {
|
||
const filteArr = this.treeArr.filter((item, index) => {
|
||
return item.indexOf(val) !== -1;
|
||
})
|
||
this.filterpickeArr = [...filteArr]
|
||
this.pickeValue = this.filterpickeArr[0]
|
||
},
|
||
//取消
|
||
cancle() {
|
||
this.$refs.popup.close()
|
||
},
|
||
//确认
|
||
confirm() {
|
||
this.selctValue = this.pickeValue
|
||
this.$refs.popup.close()
|
||
const selectData = {
|
||
selectProvince: this.selectProvince,
|
||
selectCity: this.selectCity,
|
||
selectCounty: this.selectCounty
|
||
}
|
||
let showValue = this.selectProvince.value + '/' + this.selectCity.value + '/' + this.selectCounty.value
|
||
//回显
|
||
this.selctValue = showValue
|
||
this.$emit('confirm', selectData)
|
||
},
|
||
// 滑动
|
||
bindChange: function(e) {
|
||
const val = e.detail.value
|
||
//联动-实现
|
||
this.linkArr(val)
|
||
},
|
||
|
||
//联动实现
|
||
linkArr(val = []) {
|
||
let provinceIndex = val[0]
|
||
let cityIndex = val[1]
|
||
let countyIndex = val[2]
|
||
if (provinceIndex || provinceIndex === 0) {
|
||
//说明第一列 改变了------
|
||
this.cities = (this.provinces[provinceIndex] || {}).children
|
||
this.counties = (this.cities[0] || {}).children
|
||
//默认选中的数据
|
||
this.selectProvince = this.provinces[provinceIndex]
|
||
this.selectCity = this.cities[0]
|
||
this.selectCounty = this.counties[0]
|
||
}
|
||
if (cityIndex || cityIndex === 0) {
|
||
//说明第二列 改变了------
|
||
this.counties = (this.cities[cityIndex] || {}).children
|
||
//默认选中的数据
|
||
this.selectCity = this.cities[cityIndex]
|
||
this.selectCounty = this.counties[0]
|
||
}
|
||
if (countyIndex || countyIndex === 0) {
|
||
//说明第三列 改变了-----
|
||
//默认选中的数据
|
||
this.selectCounty = this.counties[countyIndex]
|
||
}
|
||
|
||
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.demo-uni-col {
|
||
height: 36px;
|
||
}
|
||
|
||
.picker-view {
|
||
height: 50vh;
|
||
width: 100vw;
|
||
margin-top: 20rpx;
|
||
}
|
||
|
||
.center {
|
||
display: flex;
|
||
flex-direction: row;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
</style> |