利用级联选择器实现省市区三级联动【vue + elementUI Plus | uViewUI】

准备数据

行政区划代码数据下载 github 链接

首先获得省市区三级联动数据 pca-code.json 放置在项目文件夹内
数据格式如图:
在这里插入图片描述

vue + ElementUI Plus 利用级联选择器实现省市区三级联动

elementUI 级联选择器

学习记录

  1. props
    elementui 级联选择器api提供 props 将value,label,children指定为当前数据的自定义属性值
    通过 :props=“cityProps”
cityProps:{
   value:'code',   // 指定选项的 值 为选项对象的某个属性值
   label:'name',   // 指定选项 标签 为选项对象的某个属性值	
   children: 'children'    //指定选项的 子选项 为选项对象的某个属性值
}

在这里插入图片描述
在这里插入图片描述2. getCheckedNodes
绑定值变化时触发返回的数据为value值,如果需要省市区名字(label)等数据则需要通过提供的getCheckedNodes 来实现
tips:前提需要获取选择器的ref
在这里插入图片描述

let addrNode = this.$refs['cascaderAddr'].getCheckedNodes()[0]
console.log('addrNode',addrNode);

获取得到:
在这里插入图片描述

具体代码

<el-cascader v-model="addr" ref="cascaderAddr" :options="options" :props="cityProps" 
			 placeholder="请选择省市区" @change="handleAddrChange"></el-cascader>
import cityData from '@/assets/json/pca-code.json'

export default {
    name: '',
    components: {},
    data() {
        return{
            addr:"",
            options: cityData,
            cityProps:{
                value:'code',   // 指定选项的 值 为选项对象的某个属性值
                label:'name',   // 指定选项 标签 为选项对象的某个属性值	
                children: 'children'    //指定选项的 子选项 为选项对象的某个属性值
            }
        }
    },
    methods: {
        handleAddrChange(e){
            // 获取当前选中节点的数组
            let addrNode = this.$refs['cascaderAddr'].getCheckedNodes()[0]
            // 在 vue3 setup 语法糖内请使用 ↓ (tips:需先获取ref  const cascaderAddr = ref() )
            // let addrNode = unref(cascaderAddr).getCheckedNodes()[0].pathLabels

            let addrText = addrNode.pathLabels.join("-")
            console.log('addrNode',addrNode, addrText);
        }
    }
}

效果
在这里插入图片描述
在这里插入图片描述

vue + uViewUI 利用选择器多列联动实现省市区三级联动 (uniapp

学习记录

uViewUI 2.X 选择器

列数据处理
uViewUI 的列数据和elementUI不同,columns参数为二维数组,可以传入自定义选项值,可以通过keyName参数控制对应的显示属性
官方示例:在这里插入图片描述
实现省市区三级联动需要对原数据进行处理:
1、对数据进行初始化

this.addrColumnsData[0] = cityCode.map(item => {
	return {
		name: item.name,
		code: item.code
	}
})
this.addrColumnsData[1] = cityCode[0].children.map(item => {
	return {
		name: item.name,
		code: item.code
	}
})
this.addrColumnsData[2] = cityCode[0].children[0].children.map(item => {
	return {
		name: item.name,
		code: item.code
	}
})
console.log("addrColumnsData",this.addrColumnsData)

获得初始化数据:
在这里插入图片描述 在这里插入图片描述
2、 选择发生改变时数据处理
利用setColumnValues,达到当前一列选择变化,后面的列值跟着变化并显示
在这里插入图片描述
❗微信小程序无法将picker实例传出来,只能通过 ref 操作
官方示例:在这里插入图片描述
对原数据进行处理如下:

// 获取第二列的值
let items = cityCode[index].children.map(item => {
	return {
		name: item.name,
		code: item.code
	}
})
picker.setColumnValues(1, items)

// 获得第二列初始化后的第三列的值
items = cityCode[index].children[0].children.map(item => {
	return {
		name: item.name,
		code: item.code
	}
})
picker.setColumnValues(2, items)

具体代码

<u-button @click.native="handleClick">请选择省市区</u-button>
<u-picker ref="addrPicker" :show="show" :columns="addrColumnsData" keyName="name"
		  @change="changeAddress" @cancel="handleClose" @confirm="handleAddrConfirm">
</u-picker>
import cityCode from '@/static/json/pca-code.json'
export default {
	data() {
		return {
			addr:'',
			show:false,
			addrColumnsData:[]   // 设置每一列的数据
		}
	},
	onLoad() {
		this.init()
	},
	methods: {
		handleClick(){
			this.show = true
		},
		handleClose(){
			this.show = false
		},
		/** 省市区三级联动数据初始化*/
		async init(){
			// 赋初值
			this.addrColumnsData[0] = cityCode.map(item => {
				return {
					name: item.name,
					code: item.code
				}
			})
			this.addrColumnsData[1] = cityCode[0].children.map(item => {
				return {
					name: item.name,
					code: item.code
				}
			})
			this.addrColumnsData[2] = cityCode[0].children[0].children.map(item => {
				return {
					name: item.name,
					code: item.code
				}
			})
			// 微信小程序无法将picker实例传出来,只能通过ref操作
			const picker = this.$refs.addrPicker
			picker.setColumns(this.addrColumnsData)
			// console.log("addrColumnsData",this.addrColumnsData)
		},
		/** 省市区三级联动选择地址改变*/
		changeAddress(e){
			const {
				columnIndex, // 当前列下标
				value,  // 为当前变化列的数组内容
				values, // 全部列数组内容
				index, 	// 当前值下标
				indexs, // 当前地区值下标
				picker = this.$refs.addrPicker, // 微信小程序无法将picker实例传出来,只能通过ref操作
			} = e
			
			// 第一列改变
			if(columnIndex === 0){
				// 获取第二列的值
				let items = cityCode[index].children.map(item => {
					return {
						name: item.name,
						code: item.code
					}
				})
				picker.setColumnValues(1, items)
				
				// 获得第二列初始化后的第三列的值
				items = cityCode[index].children[0].children.map(item => {
					return {
						name: item.name,
						code: item.code
					}
				})
				picker.setColumnValues(2, items)
			}
			
			// 第二列改变
			if(columnIndex === 1){
				// 获得第三列的值
				let items = cityCode[indexs[0]].children[index].children.map(item => {
					return {
						name: item.name,
						code: item.code
					}
				})
				picker.setColumnValues(2, items)
			}
		},
		
		/** 省市区三级联动确认*/
		handleAddrConfirm(e){
			const { indexs, values, value } = e
			this.addr = value[0].name + '-' + value[1].name + '-' + value[2].name
			this.show = false
			// console.log("e",e)
		}
	}
}

效果
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在要解决用户的问题,关于如何在Vue3和ElementUI实现省市区三级联动选择。用户需要示例代码和城市数据。首先,我需要回顾用户提供的引用内容,看看有没有相关的信息。 用户提供了三个引用,都是关于VueElementUI实现三级联动的。引用[1]提到使用pca-code.json数据文件,引用[2]和[3]则提到了element-china-area-data这个npm包,并展示了如何引入和使用。看起来用户可能已经了解过Vue2和ElementUI实现,现在想迁移到Vue3和ElementUI Plus。 首先,我需要确认Vue3和ElementUI Plus是否兼容这些方法。ElementUI PlusVue3版本的Element UI,所以应该支持类似的组件,比如级联选择器(Cascader)。而element-china-area-data这个包是否支持Vue3呢?通常来说,数据包是独立的,不涉及框架版本,所以应该可以直接使用。 接下来,需要整理步骤。首先安装数据包,然后在组件中引入需要的数据,比如regionDataPlus。然后使用ElCascader组件,配置props,特别是设置checkStrictly为true以实现任意级选择。数据绑定方面,使用v-model来绑定选择的地区数组。此外,用户可能需要显示选中的文字,这时候可以用CodeToText转换编码到文字。 然后,示例代码的结构应该是怎样的?在Vue3中,使用<script setup>语法会更简洁。需要引入regionDataPlus和CodeToText,定义selectedArea和selectedText作为响应式变量。在组件中,ElCascader的options绑定regionDataPlus,props设置必要的参数,比如label、value和children。当选择变化时,通过handleChange方法更新selectedText。 关于数据来源,element-china-area-data已经包含省市区数据,不需要额外获取pca-code.json文件,这样更方便。用户可能需要知道如何安装和使用这个包,所以步骤里要包括npm安装和引入。 可能还需要处理一些细节,比如级联选择器的样式、是否显示路径、分隔符等,但用户主要需求是基础的三级联动,所以示例代码保持简单。同时,提醒用户如果需要更详细的数据,可以使用regionDataPlus,因为它包含四级(省市区镇),但通常三级就够了。 最后,生成相关问题时要考虑用户可能遇到的下一步问题,比如数据来源、样式调整、表单验证等。确保问题与主题相关,帮助用户深入理解。</think>### Vue3 + ElementUI Plus实现省市区三级联动选择 在Vue3中通过ElementUI Plus级联选择器实现省市区三级联动,推荐使用`element-china-area-data`数据包。以下是具体实现步骤: 1. **安装数据包** ```bash npm install element-china-area-data ``` 2. **组件代码示例** ```vue <template> <el-cascader v-model="selectedArea" :options="regionData" :props="propsConfig" @change="handleChange" ></el-cascader> <div>选中结果:{{ selectedText }}</div> </template> <script setup> import { ref } from 'vue'; import { regionDataPlus, CodeToText } from 'element-china-area-data'; const propsConfig = { label: 'name', value: 'code', children: 'children', checkStrictly: true // 允许选择任意一级 }; const selectedArea = ref([]); const selectedText = ref(''); const handleChange = (value) => { selectedText.value = value .map(code => CodeToText[code]) .filter(Boolean) .join('/'); }; const regionData = regionDataPlus; </script> ``` 3. **关键说明**: - 数据包包含`provinceAndCityData`(二级)和`regionDataPlus`(四级)两种格式[^3] - `CodeToText`对象可将行政区划代码转换为中文名称[^2] - 级联选择器支持选择任意级别行政区划[^1] - 默认使用带"市辖区"的四级数据(省-市-区-镇)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值