uniapp-省市区三级联动的实现

uniapp-省市区三级联动

插件地址:https://ext.dcloud.net.cn/plugin?id=1301
在这里插入图片描述

目前还是个前端小白,所以都是找别人的插件来使用,如果有更好的求分享!!!

导入插件

我是用Hbuilder直接导入:
在这里插入图片描述

遇到的错误

报错:
Avoid using non-primitive value as key, use string/number value instead. 09:39:45.540 found in
解决:
v-for循环里,key值重复

报错:Duplicate keys detected: ‘[object Object]’. This may cause an update error.
09:41:20.954 found in
解决:还是键值的问题,检测到重复的键值

修改插件中的代码:
v-for="(item,index) in cityData" :key=“index”

修改内容

修改:
1.将原插件的四级联动修改成了三级联动

2.在最后一次地区选择方法中,加入一个返回值,可以返回给input标签
this.bb=this.province+" “+this.city+” "+this.area;
this.$emit(“conceal”,this.bb);

3.可以修改插件的高度
this.heightCot = (res.safeArea.height * 2) / 3

4.设置插件弹出时机
通过设置popup初始为false
点击输入框 设置 this.popup=true

代码

插件的内容
erha-picker.vue

<template>
	<view>
		<view class="ifshow" @click="showList">
			<view class="level-container">
					<ul class="name-list">
						<li :class="showIndex==0?'select':''" @click="anewSelect(0)">{{province}}</li>
						<li :class="showIndex==1?'select':''" @click="anewSelect(1)" v-if="showIndex>=1">{{city}}</li>
						<li :class="showIndex==2?'select':''" @click="anewSelect(2)" v-if="showIndex>=2">{{area}}</li>
					<!-- 	<li :class="showIndex==3?'select':''" @click="anewSelect(3)" v-if="showIndex>=3">{{street}}</li> -->
					</ul>
					<ul v-if="showIndex==0" class="content" :style="'height:'+ heightCot + 'rpx'">
						<li @click="selectPro(index,item.label)" v-for="(item,index) in provinceData" :key="index">{{item.label}}</li>
					</ul>
			
					<ul v-if="showIndex==1" class="content" :style="'height:'+ heightCot + 'rpx'">
						<li @click="selectCity(index,item.label)" v-for="(item,index) in cityData" :key="index">{{item.label}}</li>
					</ul>
			
					<ul v-if="showIndex==2" class="content" :style="'height:'+ heightCot + 'rpx'">A
						<li @click="selectaArea(index,item.label)" v-for="(item,index) in areaData" :key="index">{{item.label}}</li>
					</ul>
			<!-- 
					<ul v-if="showIndex==3" class="content" :style="'height:'+ heightCot + 'rpx'">
						<li @click="selectStreet(index,item)" v-for="(item,index) in streetsData" :key="index">{{item}}</li>
					</ul> -->
				</view>
		</view>
	</view>
</template>

<script>
	import provinceData from './city-data/province.js';
	import getCity from './city-data/city.js';
	import getArea from './city-data/area.js';
	// import getStreets from './city-data/streets.js';
	export default {
		data() {
			return {
				province: "请选择",
				city: "请选择",
				area: "请选择",
				// street: "请选择",
				cityDataAll: '', // 市的所有數據
				getAreaAll: '', // 区的所有数据
				// getStreetsAll: '', // 街道的所有数据
				presentIndex: [],
				proIndex: 0,
				cityIndex: 0,
				areaIndex: 0,

				provinceData: '', // 当前展示的省数据
				cityData: '', // 当前展示的市数据
				areaData: '', //当前展示的区数据
				// streetsData: '', //当前展示的区数据
				showIndex: 0,
				heightCot: 0,
				bb: 0
			}
		},
		created() {
			uni.getSystemInfo({
				success: res => {
					// 设置组件所占高度
					// console.log(res.safeArea.height)
					this.heightCot = (res.safeArea.height * 2) / 3
				}
			})
		},
		mounted() {
			// console.log(provinceData)
			this.provinceData = provinceData;
			this.cityDataAll = getCity;
			this.getAreaAll = getArea;
			// this.getStreetsAll = getStreets
		},
		methods: {
			showList(e){
				console.log("111111")
			},
			anewSelect(num) {
				switch (num) {
					case 0:
						this.showIndex = 0;
						this.areaData = [];
						// this.streetsData = [];
						this.city = '请选择';
						this.area = '请选择';
						// this.street = '请选择'
						break;
					case 1:
						this.showIndex = 1;
						this.areaData = [];
						// this.streetsData = [];
						this.area = '请选择';
						// this.street = '请选择'
						break;
					case 2:
						console.log(11111);
						break;
				}
			},
			selectPro(index, label) {
				console.log(index)
				const {
					cityDataAll
				} = this;
				this.proIndex = index; // 当前省的下标
				this.province = label;
				this.cityData = cityDataAll[index];
				this.showIndex = 1;

			},
			selectCity(index, label) {
				const {
					proIndex
				} = this;
				//当前选择的地区下标
				// console.log(this.getAreaAll)
				this.city = label;
				this.cityIndex = index; // 当前市的下标
				this.areaData = this.getAreaAll[proIndex][index];
				this.showIndex = 2;
			},
			selectaArea(index, label) {
				const {
					proIndex,
					cityIndex
				} = this;
				this.area = label;
				this.showIndex = 3;
				this.bb=this.province+" "+this.city+" "+this.area;
				// console.log(this.bb);
				this.$emit("conceal",this.bb);
			}
		}
	}
</script>

<style lang="less">
	.ifshow{
		
	}
	ul,li{
		list-style: none;
	}
	.level-container {
		width: 100%;
		background: #ffffff;
		position: fixed;
		bottom: 0;

		.select {
			color: red;
			position: relative;

			&::after {
				content: '';
				width: 40rpx;
				height: 6rpx;
				background: red;
				position: absolute;
				left: 50%;
				bottom: -8rpx;
				margin-left: -20rpx;
			}
		}

		li {
			font-size: 26rpx;
		}

		.content,
		.name-list {
			padding: 0 20rpx;
		}

		.title {
			font-size: 32rpx;
			margin: 30rpx 20rpx;
		}

		.name-list {
			display: flex;

			li {
				margin-right: 40rpx;
				padding-bottom: 6rpx;
			}
		}

		.content {
			margin-top: 20rpx;
			height: 600rpx;
			overflow-y: auto;

			li {
				border-bottom: 1px solid #f1f1f1;
				padding: 20rpx 0;
			}

			li:last-child {
				border-bototm: none !important;
			}
		}
	}
</style>

主页代码:

<template>
	<view class="item">
		<ehPicker @conceal="conceal" v-if="popup" />
		<view class="list11 f-r a-c">
			<text>选择地区</text>
			<input type="text" placeholder="选择省/市/区" v-model="address1" @click="add" />
			
		</view>
		<view class="p-t-20">
			<button style="background-color: #4a95df; color: #FFFFFF;" type="default" @click="addAddress">保存</button>
		</view>
	</view>
</template>

<script>
	import ehPicker from '@/components/erha-picker/erha-picker.vue'; 	
	export default {
		data() {
			return {
				name:'',
				phone:'',
				address:'',
				address1:'',
				address2:'',
				popup:false
			}
		},
		methods:{
			addAddress:e=>{
				console.log("已添加")
			}
		},
		components:{
		    ehPicker
		},
		methods:{
			add(e){
				this.popup=true
			},
			conceal(param) {
				// 获取到传过来的 省 市 区 县数据
				console.log("22222222");
				// 选择完毕后隐藏
				this.popup = false;		
				this.address1 = param;
			},		
			addAddress(e){
				console.log("已添加")
			}
		}

	}
</script>

<style>

	
	
</style>

实现效果

Uniapp 中可以使用 uview-ui 组件库中的 `u-picker` 组件来实现省市区三级联动功能。以下是一个简单的示例: 1. 首先,确保你已经安装了 uview-ui 组件库。可以通过 npm 安装或直接下载源码引入。 2. 在需要使用省市区三级联动的页面中,引入 `u-picker` 组件: ```vue <template> <view> <u-picker :data="provinceList" v-model="selectedProvince" @change="handleProvinceChange"></u-picker> <u-picker :data="cityList" v-model="selectedCity" @change="handleCityChange"></u-picker> <u-picker :data="districtList" v-model="selectedDistrict"></u-picker> </view> </template> <script> import { UPicker } from 'uview-ui'; export default { components: { UPicker, }, data() { return { provinceList: ['省1', '省2', '省3'], // 省份数据 cityList: [], // 城市数据,根据选择的省份动态生成 districtList: [], // 区域数据,根据选择的城市动态生成 selectedProvince: '', // 已选择的省份 selectedCity: '', // 已选择的城市 selectedDistrict: '', // 已选择的区域 }; }, methods: { handleProvinceChange(value) { // 根据已选择的省份 value,动态生成城市数据 // 可以通过接口请求获取对应省份下的城市数据 // 更新 cityList }, handleCityChange(value) { // 根据已选择的城市 value,动态生成区域数据 // 可以通过接口请求获取对应城市下的区域数据 // 更新 districtList }, }, }; </script> ``` 在上述示例中,我们使用了三个 `u-picker` 组件来实现省市区三级联动。`provinceList` 是省份的数据源,`cityList` 和 `districtList` 是在选择省份和城市时动态生成的数据源。通过监听 `change` 事件,我们可以在选择省份和城市时更新相应的数据源。 注意:上述示例中的数据源只是示意,实际开发中需要根据项目需求使用真实的数据源。 希望以上示例对你有所帮助!如果有任何疑问,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值