123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <template>
- <view class="w-picker-view">
- <picker-view class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange">
- <picker-view-column>
- <view class="w-picker-item" v-for="(item,index) in range.provinces" :key="index">{{item.label}}</view>
- </picker-view-column>
- <picker-view-column>
- <view class="w-picker-item" v-for="(item,index) in range.citys" :key="index">{{item.label}}</view>
- </picker-view-column>
- <picker-view-column v-if="!hideArea">
- <view class="w-picker-item" v-for="(item,index) in range.areas" :key="index">{{item.label}}</view>
- </picker-view-column>
- </picker-view>
- </view>
- </template>
- <script>
- import areaData from "./areadata/areadata.js"
- export default {
- data() {
- return {
- pickVal:[],
- range:{
- provinces:[],
- citys:[],
- areas:[]
- },
- checkObj:{}
- };
- },
- props:{
- itemHeight:{
- type:String,
- default:"44px"
- },
- value:{
- type:[Array,String],
- default:""
- },
- defaultType:{
- type:String,
- default:"label"
- },
- hideArea:{
- type:Boolean,
- default:false
- }
- },
- watch:{
- value(val){
- this.initData();
- }
- },
- created() {
- this.initData();
- },
- methods:{
- getData(){
- //用来处理初始化数据
- let provinces=areaData;
- let dVal=[];
- let value=this.value;
- let a1=value[0];//默认值省
- let a2=value[1];//默认值市
- let a3=value[2];//默认值区、县
- let province,city,area;
- let provinceIndex=provinces.findIndex((v)=>{
- return v[this.defaultType]==a1
- });
- provinceIndex=value?(provinceIndex!=-1?provinceIndex:0):0;
- let citys=provinces[provinceIndex].children;
- let cityIndex=citys.findIndex((v)=>{
- return v[this.defaultType]==a2
- });
- cityIndex=value?(cityIndex!=-1?cityIndex:0):0;
- let areas=citys[cityIndex].children;
- let areaIndex=areas.findIndex((v)=>{
- return v[this.defaultType]==a3;
- });
- areaIndex=value?(areaIndex!=-1?areaIndex:0):0;
- dVal=this.hideArea?[provinceIndex,cityIndex]:[provinceIndex,cityIndex,areaIndex];
- province=provinces[provinceIndex];
- city=citys[cityIndex];
- area=areas[areaIndex];
- let obj=this.hideArea?{
- province,
- city
- }:{
- province,
- city,
- area
- }
- return this.hideArea?{
- provinces,
- citys,
- dVal,
- obj
- }:{
- provinces,
- citys,
- areas,
- dVal,
- obj
- }
- },
- initData(){
- let dataData=this.getData();
- let provinces=dataData.provinces;
- let citys=dataData.citys;
- let areas=this.hideArea?[]:dataData.areas;
- let obj=dataData.obj;
- let province=obj.province,city=obj.city,area=this.hideArea?{}:obj.area;
- let value=this.hideArea?[province.value,city.value]:[province.value,city.value,area.value];
- let result=this.hideArea?`${province.label+city.label}`:`${province.label+city.label+area.label}`;
- this.range=this.hideArea?{
- provinces,
- citys,
- }:{
- provinces,
- citys,
- areas
- };
- this.checkObj=obj;
- this.$nextTick(()=>{
- this.pickVal=dataData.dVal;
- });
- this.$emit("change",{
- result:result,
- value:value,
- obj:obj
- })
- },
- handlerChange(e){
- let arr=[...e.detail.value];
- let provinceIndex=arr[0],cityIndex=arr[1],areaIndex=this.hideArea?0:arr[2];
- let provinces=areaData;
- let citys=(provinces[provinceIndex]&&provinces[provinceIndex].children)||provinces[provinces.length-1].children||[];
- let areas=this.hideArea?[]:((citys[cityIndex]&&citys[cityIndex].children)||citys[citys.length-1].children||[]);
- let province=provinces[provinceIndex]||provinces[provinces.length-1],
- city=citys[cityIndex]||[citys.length-1],
- area=this.hideArea?{}:(areas[areaIndex]||[areas.length-1]);
- let obj=this.hideArea?{
- province,
- city
- }:{
- province,
- city,
- area
- }
- if(this.checkObj.province.label!=province.label){
- //当省更新的时候需要刷新市、区县的数据;
- this.range.citys=citys;
- if(!this.hideArea){
- this.range.areas=areas;
- }
-
- }
- if(this.checkObj.city.label!=city.label){
- //当市更新的时候需要刷新区县的数据;
- if(!this.hideArea){
- this.range.areas=areas;
- }
- }
- this.checkObj=obj;
- this.$nextTick(()=>{
- this.pickVal=arr;
- })
- let result=this.hideArea?`${province.label+city.label}`:`${province.label+city.label+area.label}`;
- let value=this.hideArea?[province.value,city.value]:[province.value,city.value,area.value];
- this.$emit("change",{
- result:result,
- value:value,
- obj:obj
- })
- }
- }
- }
- </script>
- <style lang="scss">
- @import "./w-picker.css";
- </style>
|