Vue + Vant Picker实现省市区三级联动

一、picker选择器的数据由columns属性控制,columns中有几个元素就代表该选择器有多少级,通过change方法来给对应列赋值

this.columns = [
	{
		values: citys,
		className: "column1",
		defaultIndex: 0,
		flex: 1, //控制每列的宽度
	},
	{
		values: citys[0].children,
		className: "column2",
		defaultIndex: 0,
		flex: 1, //控制每列的宽度
	},
	{
		values: citys[0].children[0].children,
		className: "column3",
		defaultIndex: 0,
		flex: 2, //控制每列的宽度
	}
]

二、组件方法

//使用van-picker
onConfirm(value, index){
	this.cityShow = false
	let provinceCode = value[0].comCode
	let cityCode = value[1].comCode ? value[1].comCode : ''
	let areaCode = value[2] ? value[2].comCode : ''
	let provinceName = value[0].comName
	let ciryName = value[1] ? value[1].comName : ''
	let areaName = value[2] ? value[2].comName : ''
},

onChange(picker, value, index){
	if (index == 0) {
		picker.setColumnValues(index + 1, value[index].children || [])
		picker.setColumnValues(
			 index + 2,
			  value[index].children[index].children || []
		)
	}
		
	if (index == 1) {
		   picker.setColumnValues(index + 1, value[index].children || []);
	}
}, 

三、后台返回数据格式

city = [{
	{
		"children": [{
			"children": [{
				"comCode": "110101",
				"comName": "东城区"
			},
			{
				"comCode": "110102",
				"comName": "西城区"
			},
			{
				"comCode": "110105",
				"comName": "朝阳区"
			},
			{
				"comCode": "110106",
				"comName": "丰台区"
			},
			{
				"comCode": "110107",
				"comName": "石景山区"
			},
			{
				"comCode": "110108",
				"comName": "海淀区"
			},
			{
				"comCode": "110109",
				"comName": "门头沟区"
			},
			{
				"comCode": "110111",
				"comName": "房山区"
			},
			{
				"comCode": "110112",
				"comName": "通州区"
			},
			{
				"comCode": "110113",
				"comName": "顺义区"
			},
			{
				"comCode": "110114",
				"comName": "昌平区"
			},
			{
				"comCode": "110115",
				"comName": "大兴区"
			},
			{
				"comCode": "110116",
				"comName": "怀柔区"
			},
			{
				"comCode": "110117",
				"comName": "平谷区"
			},
			{
				"comCode": "110118",
				"comName": "密云区"
			},
			{
				"comCode": "110119",
				"comName": "延庆区"
			}],
			"comCode": "110000",
			"comName": "北京市"
		}],
		"comCode": "110000",
		"comName": "北京"
	}]

四、页面组件

<van-popup v-model="cityShow" position="bottom">
	<van-picker show-toolbar value-key="comName" :columns="columns" @cancel="cityShow = false"
	@confirm="onConfirm" @change="onChange" />
</van-popup>

五、vant picker文档链接

Vant 2 - Mobile UI Components built on Vue

页面实现效果

 

### 省市区选择组件库的选择 对于省市区选择功能,在前端UI框架中的实现方式主要依赖于所选框架提供的特定组件以及这些组件如何集成到应用程序中。一个优秀的UI组件库能够极大地提高开发效率并确保用户体验的一致性和友好度。 #### 使用Element UI实现省市区选择 Element UI提供了一个名为`Cascader`级联选择器的组件,该组件非常适合用来创建省市区选择的功能[^1]。通过配置选项数据源,可以轻松构建一个多级联动菜单结构,允许用户逐层选择省份、城市和地区。下面是一个简单的例子: ```html <template> <el-cascader :options="regionOptions" v-model="selectedRegion"></el-cascader> </template> <script> export default { data() { return { regionOptions: [ // 这里填充具体的省市地区数据... ], selectedRegion: [] }; } }; </script> ``` #### 利用Vant进行移动端开发 针对移动应用或者响应式设计的需求,Vant提供了类似的解决方案——Picker组件支持多列滚动选择,同样适用于制作省市区挑选工具[^3]。其优势在于更贴近手机原生控件样式,操作流畅自然。 ```html <van-area title="选择区域" value="110101"/> <!-- 或者 --> <van-picker-column ref="provinceColumn"> <!-- 渲染省级列表项 --> </van-picker-column> <van-picker-column ref="cityColumn"> <!-- 渲染市级列表项 --> </van-picker-column> <van-picker-column ref="districtColumn"> <!-- 渲染区县级列表项 --> </van-picker-column> ``` #### Ant Design Vue的企业级方案 如果项目规模较大或是企业内部管理系统,则可能更适合采用Ant Design Vue这样的重型武器。它不仅拥有强大的API文档和支持社区,还特别强调国际化特性,这对于跨国业务尤为重要。 ```jsx import { Cascader } from 'ant-design-vue'; const options = [...]; // 定义好各级别的地理信息数组 return ( <a-cascader options={options} placeholder="请选择地址..." /> ); ``` 以上三种方法分别对应不同场景下的最佳实践,开发者可以根据具体需求和技术栈偏好做出合适的选择。值得注意的是,无论选用哪种技术路线,都应考虑到后期维护成本及团队成员对该技术栈的掌握程度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值