| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 | 
							- <!-- 
 
-  * 省市区选择器
 
-  * @作者:陈万照
 
-  * @公司:山东标梵互动信息技术有限公司
 
-  * @官网:http://biaofun.com/
 
-  * @微信:C207668802
 
-  * @QQ:207668802
 
-  * @邮箱:cwz@biaofun.com || 207668802@qq.com
 
-  * @版本:v1.0.8
 
-  -->
 
- <template>
 
- 	<view class="region">
 
- 		<picker mode="multiSelector" :range="range" range-key="name" @change="change" @columnchange="columnchange" :value="value" :disabled="disabled">
 
- 			<view class="content" :class="{ placeholder: !regionStr }">
 
- 				<text class="ellipsis-1">{{ regionStr ? regionStr : placeholder }}</text>
 
- 			</view>
 
- 		</picker>
 
- 	</view>
 
- </template>
 
- <script>
 
- const regionData = require('@/static/region.json');
 
- export default {
 
- 	/**
 
- 	 * 数据
 
- 	 */
 
- 	props: {
 
- 		// 是否禁用
 
- 		disabled: {
 
- 			type: Boolean,
 
- 			default: false
 
- 		},
 
- 		// placeholder
 
- 		placeholder: {
 
- 			type: String,
 
- 			default: '请选择省/市/区'
 
- 		},
 
- 		// 默认值
 
- 		defaultValue: {
 
- 			type: Array,
 
- 			default() {
 
- 				return null;
 
- 			}
 
- 		}
 
- 	},
 
- 	/**
 
- 	 * 数据
 
- 	 */
 
- 	data() {
 
- 		return {
 
- 			range: [[], [], []], // 省/市/区
 
- 			value: [0, 0, 0], // value 的值表示选择了 range 中的第几个(下标从 0 开始),默认为 [0, 0, 0],即 range 为 ['第一个省', '第一个省的第一个市', '第一个省的第一个市的第一个区']
 
- 			regionStr: '' // 选中的省市区字符串
 
- 		};
 
- 	},
 
- 	/**
 
- 	 * 监听数据
 
- 	 */
 
- 	watch: {
 
- 		// 默认值
 
- 		defaultValue() {
 
- 			// 设置/更新省市区数据
 
- 			this.defaultValue ? this.setDefaultValue() : this.setRange();
 
- 		}
 
- 	},
 
- 	/**
 
- 	 * 组件初次加载完成
 
- 	 */
 
- 	mounted() {
 
- 		// 设置/更新省市区数据
 
- 		this.defaultValue ? this.setDefaultValue() : this.setRange();
 
- 	},
 
- 	/**
 
- 	 * 函数
 
- 	 */
 
- 	methods: {
 
- 		/**
 
- 		 * 设置/更新省市区数据
 
- 		 */
 
- 		setRange() {
 
- 			// 省市区数据
 
- 			let range = [[], [], []];
 
- 			// 省
 
- 			regionData.forEach(el => {
 
- 				range[0].push({
 
- 					id: el.id,
 
- 					level: el.level,
 
- 					name: el.name,
 
- 					pid: el.pid
 
- 				});
 
- 			});
 
- 			// 市
 
- 			regionData[this.value[0]].children.forEach(el => {
 
- 				range[1].push({
 
- 					id: el.id,
 
- 					level: el.level,
 
- 					name: el.name,
 
- 					pid: el.pid
 
- 				});
 
- 			});
 
- 			// 区
 
- 			regionData[this.value[0]].children[this.value[1]].children.forEach(el => {
 
- 				range[2].push({
 
- 					id: el.id,
 
- 					level: el.level,
 
- 					name: el.name,
 
- 					pid: el.pid
 
- 				});
 
- 			});
 
- 			// 更新省市区数据
 
- 			this.range = range;
 
- 		},
 
- 		/**
 
- 		 * 设置默认值
 
- 		 */
 
- 		setDefaultValue() {
 
- 			// 查找省
 
- 			let provinceIndex = regionData.findIndex(el => {
 
- 				return el.name == this.defaultValue[0];
 
- 			});
 
- 			if(provinceIndex < 0) provinceIndex = 0;
 
- 			// 查找市
 
- 			let cityIndex = regionData[provinceIndex].children.findIndex(el => {
 
- 				return el.name == this.defaultValue[1];
 
- 			});
 
- 			if(cityIndex < 0) cityIndex = 0;
 
- 			// 查找区
 
- 			let areaIndex = regionData[provinceIndex].children[cityIndex].children.findIndex(el => {
 
- 				return el.name == this.defaultValue[2];
 
- 			});
 
- 			if(areaIndex < 0) areaIndex = 0;
 
- 			// 更新 value 的值
 
- 			this.value = [provinceIndex, cityIndex, areaIndex];
 
- 			// 设置/更新省市区数据
 
- 			this.setRange();
 
- 			// 更新选中的省市区字符串
 
- 			this.regionStr =
 
- 				regionData[provinceIndex].name + '·' + regionData[provinceIndex].children[cityIndex].name + '·' + regionData[provinceIndex].children[cityIndex].children[areaIndex].name;
 
- 		},
 
- 		/**
 
- 		 * 某一列的值改变时触发
 
- 		 * @param {Number} event.detail.column 表示改变了第几列(下标从0开始)
 
- 		 * @param {Number} event.detail.value 表示变更值的下标
 
- 		 */
 
- 		columnchange(event) {
 
- 			// 改变的是省
 
- 			if (event.detail.column == 0) {
 
- 				this.value = [event.detail.value, 0, 0];
 
- 			}
 
- 			// 改变的是市
 
- 			if (event.detail.column == 1) {
 
- 				this.value.splice(1, 1, event.detail.value);
 
- 				this.value.splice(2, 1, 0);
 
- 			}
 
- 			// 改变的是区
 
- 			if (event.detail.column == 2) {
 
- 				this.value.splice(2, 1, event.detail.value);
 
- 			}
 
- 			// 设置/更新省市区数据
 
- 			this.setRange();
 
- 		},
 
- 		/**
 
- 		 * 确认选择
 
- 		 */
 
- 		change(event) {
 
- 			// 更新选中的省市区字符串
 
- 			this.regionStr = this.range[0][this.value[0]].name + '·' + this.range[1][this.value[1]].name + '·' + this.range[2][this.value[2]].name;
 
- 			// 传递事件
 
- 			this.$emit('change', [this.range[0][this.value[0]], this.range[1][this.value[1]], this.range[2][this.value[2]]]);
 
- 		}
 
- 	}
 
- };
 
- </script>
 
- <style lang="scss" scoped>
 
- .ellipsis-1 {
 
- 	display: -webkit-box;
 
- 	-webkit-box-orient: vertical;
 
- 	-webkit-line-clamp: 1;
 
- 	overflow: hidden;
 
- }
 
- .content {
 
- 	text-align: right;
 
- }
 
- .placeholder {
 
- 	color: #949596;
 
- }
 
- </style>
 
 
  |