|
|
<template> <div class="mpvue-picker"> <div :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></div> <div class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}"> <div class="mpvue-picker__hd" catchtouchmove="true"> <div class="mpvue-picker__action" @click="pickerCancel">取消</div> <div class="mpvue-picker__action" :style="{color:themeColor}" @click="pickerConfirm">确定</div> </div> <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange"> <block> <picker-view-column> <div class="picker-item" v-for="(item,index) in provinceDataList" :key="index">{{item.label}}</div> </picker-view-column> <picker-view-column> <div class="picker-item" v-for="(item,index) in cityDataList" :key="index">{{item.label}}</div> </picker-view-column> <picker-view-column> <div class="picker-item" v-for="(item,index) in areaDataList" :key="index">{{item.label}}</div> </picker-view-column> </block> </picker-view> </div> </div> </template>
<script> import provinceData from './city-data/province.js'; import cityData from './city-data/city.js'; import areaData from './city-data/area.js'; export default { data() { return { pickerValue: [0, 0, 0], provinceDataList: [], cityDataList: [], areaDataList: [], /* 是否显示控件 */ showPicker: false, }; }, created() { this.init() }, props: { /* 默认值 */ pickerValueDefault: { type: Array, default(){ return [0, 0, 0] } }, /* 主题色 */ themeColor: String }, watch:{ pickerValueDefault(){ this.init(); } }, methods: { async getaddess() { let reinfo=await this.$api.getaddress({action:'getaddress'}); this.provinceDataList=reinfo.data.province; this.cityDataList=reinfo.data.city; this.areaDataList=reinfo.data.area; }, init() { this.handPickValueDefault(); // 对 pickerValueDefault 做兼容处理
this.getaddess(); // this.provinceDataList = provinceData;
// this.cityDataList = cityData[this.pickerValueDefault[0]];
// this.areaDataList = areaData[this.pickerValueDefault[0]];
this.pickerValue = this.pickerValueDefault; }, show() { setTimeout(() => { this.showPicker = true; }, 0); }, maskClick() { this.pickerCancel(); }, pickerCancel() { this.showPicker = false; this._$emit('onCancel'); }, pickerConfirm(e) { this.showPicker = false; this._$emit('onConfirm'); }, showPickerView() { this.showPicker = true; }, handPickValueDefault() { if (this.pickerValueDefault !== [0, 0, 0]) { if (this.pickerValueDefault[0] > provinceData.length - 1) { this.pickerValueDefault[0] = provinceData.length - 1; } if (this.pickerValueDefault[1] > cityData[this.pickerValueDefault[0]].length - 1) { this.pickerValueDefault[1] = cityData[this.pickerValueDefault[0]].length - 1; } if (this.pickerValueDefault[2] > areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]].length - 1) { this.pickerValueDefault[2] = areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]].length - 1; } } }, pickerChange(e) { let changePickerValue = e.mp.detail.value; if (this.pickerValue[0] !== changePickerValue[0]) { // 第一级发生滚动
this.cityDataList = cityData[changePickerValue[0]]; this.areaDataList = areaData[changePickerValue[0]][0]; changePickerValue[1] = 0; changePickerValue[2] = 0; } else if (this.pickerValue[1] !== changePickerValue[1]) { // 第二级滚动
this.areaDataList = areaData[changePickerValue[0]][changePickerValue[1]]; changePickerValue[2] = 0; } this.pickerValue = changePickerValue; this._$emit('onChange'); }, _$emit(emitName) { let pickObj = { label: this._getLabel(), value: this.pickerValue, cityCode: this._getCityCode() }; this.$emit(emitName, pickObj); }, _getLabel() { let pcikerLabel = this.provinceDataList[this.pickerValue[0]].label + '-' + this.cityDataList[this.pickerValue[1]].label + '-' + this.areaDataList[this.pickerValue[2]].label; return pcikerLabel; }, _getCityCode() { return this.areaDataList[this.pickerValue[2]].value; } } }; </script>
<style> .pickerMask { position: fixed; z-index: 1000; top: 0; right: 0; left: 0; bottom: 0; background: rgba(0, 0, 0, 0.6); } .mpvue-picker-content { position: fixed; bottom: 0; left: 0; width: 100%; transition: all 0.3s ease; transform: translateY(100%); z-index: 3000; } .mpvue-picker-view-show { transform: translateY(0); } .mpvue-picker__hd { display: flex; padding: 9px 15px; background-color: #fff; position: relative; text-align: center; font-size: 17px; } .mpvue-picker__hd:after { content: ' '; position: absolute; left: 0; bottom: 0; right: 0; height: 1px; border-bottom: 1px solid #e5e5e5; color: #e5e5e5; transform-origin: 0 100%; transform: scaleY(0.5); } .mpvue-picker__action { display: block; flex: 1; color: #1aad19; } .mpvue-picker__action:first-child { text-align: left; color: #888; } .mpvue-picker__action:last-child { text-align: right; } .picker-item { text-align: center; line-height: 40px; text-overflow: ellipsis; white-space: nowrap; font-size: 16px; } .mpvue-picker-view { position: relative; bottom: 0; left: 0; width: 100%; height: 238px; background-color: rgba(255, 255, 255, 1); } </style>
|