uni-app封装省市区下拉组件(后台获取数据)

一.后台数据格式

PROCINCE:[{itemName:'',itemValue:''}]

CITY:[{itemName:'',itemValue}]

AREA:[{itemName:'',itemValue}]

前端将地址数据缓存在了pinia中

前端主要使用picker进行勾选

二.代码

javascript 复制代码
<template>
	<picker @change="bindPickerChange" @columnchange="columnchange" :range="array" range-key="name" :value="pickerIndex"
		mode="multiSelector">
		<slot></slot>
	</picker>
</template>

<script>
import { glPinia } from '@/pinia/index';
import { sysDictList } from '@/api/glApi';
import { getDictCacheKey } from "@/config/dictCacheKey";
const _glPinia = glPinia();
let provinceData = _glPinia.dictsData.PROCINCE;
let cityData = _glPinia.dictsData.CITY;
let areaData = _glPinia.dictsData.AREA;

export default {
	data() {
		return {
			array: [],
			pickerIndex: [0, 0, 0],
			value: [],	//由外部事件传入的值
			comType: 'normal'	//当前组件是初始状态还是修改状态
		};
	},

	created() {

	},

	methods: {
		//整个事件的起点,由外部事件调用
		initSelect(value) {
			this.value = value;
			if (!provinceData) {
				let dictsArr = getDictCacheKey();
				sysDictList(dictsArr).then(res => {
					if (res.code == 200) {
						_glPinia.setDictsData(res.data);
						provinceData = _glPinia.dictsData.PROCINCE;
						cityData = _glPinia.dictsData.CITY;
						areaData = _glPinia.dictsData.AREA;
						this.startPageEvent(value);
					}
				})
			} else {
				this.startPageEvent(value);
			}
		},

		startPageEvent(value) {
			if (Array.isArray(value) && value.length == 3 && value[0].length == 6) {
				this.comType = 'edit';
			} else {
				this.comType = 'normal';
			}

			let provinceCode = this.setProvinceData();
			let cityCode = this.setCityData(provinceCode, 'original');
			this.setAreaData(cityCode, 'original');
		},

		bindPickerChange(selectInfo) {
			let _index = selectInfo.detail.value;
			let forData = [0, 1, 2];
			let data = [];
			let code = [];
			forData.forEach(item => {
				code.push(this.array[item][_index[item]].value);
				data.push(this.array[item][_index[item]].name);
			})
			this.$emit('changeAddress', {
				data,
				code
			});
		},

		//列改变
		columnchange(columnInfo) {
			let _index = columnInfo.detail.value;
			let _column = columnInfo.detail.column;

			//省改变
			if (_column == 0) {
				this.pickerIndex[0] = _index;
				let provinceCode = this.array[0][_index].value.substr(0, 2);
				let cityCode = this.setCityData(provinceCode, 'select');
				this.setAreaData(cityCode, 'select');
			}

			//市改变
			if (_column == 1) {
				this.pickerIndex[1] = _index;
				let cityCode = this.array[1][_index].value.substr(0, 4);
				this.setAreaData(cityCode, 'select');
			}

			//区改变
			if (_column == 2) {
				this.pickerIndex[2] = _index;
			}
		},

		//设置省数据
		setProvinceData() {
			let _index;
			this.array[0] = provinceData.map(item => {
				return {
					name: item.itemName,
					value: item.itemValue
				}
			})
			if (this.comType == 'edit') {
				_index = this.array[0].findIndex(item => {
					return item.value == this.value[0];
				})
				this.pickerIndex[0] = _index;
			} else {
				this.pickerIndex[0] = 0;
			}

			return this.array[0][this.pickerIndex[0]].value.substr(0, 2);
		},

		//设置市数据,type区分是初始状态还是修改状态
		setCityData(provinceCode, type) {
			let _index, _data;
			_data = cityData.filter(item => {
				return item.itemValue.substr(0, 2) == provinceCode;
			})
			this.array[1] = _data.map(item => {
				return {
					name: item.itemName,
					value: item.itemValue
				}
			})
			if (type == 'original') {
				if (this.comType == 'edit') {
					_index = this.array[1].findIndex(item => {
						return item.value == this.value[1];
					})
					this.pickerIndex[1] = _index;
				} else {
					this.pickerIndex[1] = 0;
				}
			} else {
				this.pickerIndex[1] = 0;
			}


			return this.array[1][this.pickerIndex[1]].value.substr(0, 4);
		},

		//设置区数据,type区分是初始状态还是修改状态
		setAreaData(cityCode, type) {
			let _index, _data;
			_data = areaData.filter(item => {
				return item.itemValue.substr(0, 4) == cityCode;
			})
			this.array[2] = _data.map(item => {
				return {
					name: item.itemName,
					value: item.itemValue
				}
			})
			if (type == 'original') {
				if (this.comType == 'edit') {
					_index = this.array[2].findIndex(item => {
						return item.value == this.value[2];
					})
					this.pickerIndex[2] = _index;
				} else {
					this.pickerIndex[2] = 0;
				}
			} else {
				this.pickerIndex[2] = 0;
			}
		},
	}
};
</script>

<style></style>
相关推荐
计算机学姐11 小时前
基于微信小程序的校园失物招领管理系统【uniapp+springboot+vue】
java·vue.js·spring boot·mysql·信息可视化·微信小程序·uni-app
2501_9159214312 小时前
HTTPS前端劫持 新一代流量劫持解决方案
前端·网络协议·ios·小程序·https·uni-app·iphone
爱怪笑的小杰杰12 小时前
优化 UniApp 日历组件的多语言切换:告别 setLocale 引起的 App 重启
java·前端·uni-app
计算机学姐14 小时前
基于微信小程序的宠物服务系统【uniapp+springboot+vue】
java·vue.js·spring boot·mysql·微信小程序·uni-app·宠物
2501_9159090614 小时前
iOS应用签名的三种方法全解析:从官方到第三方工具
android·ios·小程序·https·uni-app·iphone·webview
心中无石马1 天前
uniapp引入tailwindcss4.x
前端·css·uni-app
fix一个write十个1 天前
【uniApp开发】微信小程序 web-view 内嵌 H5 跳转支付踩坑实录
微信小程序·uni-app
wuxianda10301 天前
苹果App上架4.3a被拒解决方案汇报总结
ios·uni-app·objective-c·cocoa·苹果上架·4.3a
西洼工作室2 天前
uniapp+vue3+python对接阿里云短信认证服务alibabacloud_dypnsapi20170525
python·阿里云·uni-app
wuxianda10302 天前
苹果App上架4.3a问题3天解决方案汇报总结
开发语言·javascript·uni-app·ecmascript·ios上架·苹果上架