| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 | 
							- <template>
 
- 	<picker
 
- 		mode="multiSelector"
 
- 		:value="multiIndex"
 
- 		:range="multiArray"
 
- 		@change="handleValueChange"
 
- 		@columnchange="handleColumnChange"
 
- 	>
 
- 		<slot></slot>
 
- 	</picker>
 
- </template>
 
- <script>
 
- const CHINA_REGIONS = require('./regions.json');
 
- export default {
 
- 	props: {
 
- 		defaultRegions: {
 
- 			type: Array,
 
- 			default() {
 
- 				return [];
 
- 			}
 
- 		},
 
- 		defaultRegionCode: {
 
- 			type: String
 
- 		},
 
- 		defaultRegion: [String, Array],
 
- 		value: [String, Array]
 
- 	},
 
- 	data() {
 
- 		return {
 
- 			cityArr: CHINA_REGIONS[0].childs,
 
- 			districtArr: CHINA_REGIONS[0].childs[0].childs,
 
- 			multiIndex: [0, 0, 0],
 
- 			isInitMultiArray: true
 
- 		};
 
- 	},
 
- 	watch: {
 
- 		defaultRegion: {
 
- 			handler(region, oldRegion) {
 
- 				if (Array.isArray(region)) {
 
- 					// 避免传的是字面量的时候重复触发
 
- 					oldRegion = oldRegion || [];
 
- 					if (region.join('') !== oldRegion.join('')) {
 
- 						this.handleDefaultRegion(region);
 
- 					}
 
- 				} else if (region && region.length == 6) {
 
- 					this.handleDefaultRegion(region);
 
- 				} else {
 
- 					console.warn('defaultRegion非有效格式');
 
- 				}
 
- 			},
 
- 			immediate: true
 
- 		}
 
- 	},
 
- 	computed: {
 
- 		multiArray() {
 
- 			return this.pickedArr.map(arr => arr.map(item => item.name));
 
- 		},
 
- 		pickedArr() {
 
- 			// 进行初始化
 
- 			if (this.isInitMultiArray) {
 
- 				return [
 
- 					CHINA_REGIONS,
 
- 					CHINA_REGIONS[0].childs,
 
- 					CHINA_REGIONS[0].childs[0].childs
 
- 				];
 
- 			}
 
- 			return [CHINA_REGIONS, this.cityArr, this.districtArr];
 
- 		}
 
- 	},
 
- 	methods: {
 
- 		handleColumnChange(e) {
 
- 			// console.log(e);
 
- 			this.isInitMultiArray = false;
 
- 			const that = this;
 
- 			let col = e.detail.column;
 
- 			let row = e.detail.value;
 
- 			that.multiIndex[col] = row;
 
- 			try {
 
- 				switch (col) {
 
- 					case 0:
 
- 						if (CHINA_REGIONS[that.multiIndex[0]].childs.length == 0) {
 
- 							that.cityArr = that.districtArr = [
 
- 								CHINA_REGIONS[that.multiIndex[0]]
 
- 							];
 
- 							break;
 
- 						}
 
- 						that.cityArr = CHINA_REGIONS[that.multiIndex[0]].childs;
 
- 						that.districtArr =
 
- 							CHINA_REGIONS[that.multiIndex[0]].childs[
 
- 								that.multiIndex[1]
 
- 							].childs;
 
- 						break;
 
- 					case 1:
 
- 						that.districtArr =
 
- 							CHINA_REGIONS[that.multiIndex[0]].childs[
 
- 								that.multiIndex[1]
 
- 							].childs;
 
- 						break;
 
- 					case 2:
 
- 						break;
 
- 				}
 
- 			} catch (e) {
 
- 				// console.log(e);
 
- 				that.districtArr = CHINA_REGIONS[that.multiIndex[0]].childs[0].childs;
 
- 			}
 
- 		},
 
- 		handleValueChange(e) {
 
- 			// 结构赋值
 
- 			let [index0, index1, index2] = e.detail.value;
 
- 			let [arr0, arr1, arr2] = this.pickedArr;
 
- 			let address = [arr0[index0], arr1[index1], arr2[index2]];
 
- 			// console.log(address);
 
- 			this.$emit('getRegion', address);
 
- 			this.$emit(
 
- 				'input',
 
- 				`${address[0].name}${address[1].name}${address[2].name}`
 
- 			);
 
- 		},
 
- 		handleDefaultRegion(region) {
 
- 			const isCode = !Array.isArray(region);
 
- 			this.isInitMultiArray = false;
 
- 			let children = CHINA_REGIONS;
 
- 			for (let i = 0; i < 3; i++) {
 
- 				for (let j = 0; j < children.length; j++) {
 
- 					let condition = isCode
 
- 						? children[j].code == region.slice(0, (i + 1) * 2)
 
- 						: children[j].name.includes(region[i]);
 
- 					if (condition) {
 
- 						// 匹配成功进行赋值
 
- 						// console.log(i,j,children.length-1);
 
- 						children = children[j].childs;
 
- 						if (i == 0) {
 
- 							this.cityArr = children;
 
- 						} else if (i == 1) {
 
- 							this.districtArr = children;
 
- 						}
 
- 						this.$set(this.multiIndex, i, j);
 
- 						// console.log(this.multiIndex);
 
- 						break;
 
- 					} else {
 
- 						// 首次匹配失败就用默认的初始化
 
- 						// console.log(i,j,children.length-1);
 
- 						if (i == 0 && j == children.length - 1) {
 
- 							this.isInitMultiArray = true;
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- };
 
- </script>
 
 
  |