封装一个省市区公共组件

难点:封装一个省市区三级联动的公共组件,难点在与对三级嵌套数据的处理,其中三级嵌套数据来源于github上的Administrative-divisions-of-china

javascript 复制代码
<template>
	<el-select v-model="province" class="m-2" placeholder="请选择省份" size="small">
	  <el-option
		v-for="item in areas"
		:key="item.code"
		:label="item.name"
		:value="item.code"
	  />
	</el-select>
	<el-select v-model="city" :disabled="!province" class="m-2" placeholder="请选择市" size="small">
	  <el-option
		v-for="item in selectCitys"
		:key="item.code"
		:label="item.name"
		:value="item.code"
	  />
	</el-select>
	<el-select v-model="area" :disabled="!city" class="m-2" placeholder="请选择区" size="small">
	  <el-option
		v-for="item in selectAreas"
		:key="item.code"
		:label="item.name"
		:value="item.code"
	  />
	</el-select>
  </template>
  
  <script setup>
  import { ref, watch, defineEmits } from 'vue'
  import allAreas from './lib/pca-code.json'
  
  const areas = ref(allAreas)
  const selectCitys = ref([])
  const selectAreas = ref([])
  const province = ref('')
  const city = ref('')
  const area = ref('')
  const emit = defineEmits(['change'])

  watch(province,async (value) => {
	if(value) {
		let citys = areas.value.find(item => 
			item.code===province.value
		)?.children
		selectCitys.value = citys
		city.value = ''
		area.value = ''
	}else{
		return
	}
  })
  
  watch(city,async (value) => {
	if(value) {
		let areas = selectCitys.value.find(item => 
			item.code===city.value
		)?.children
		selectAreas.value = areas
		area.value = ''
	}else{
		return
	}
  })

  watch(area,async (value) => {
	if(value) {
		let provinceData = {
			code: province.value,
			name: areas.value.find(item => item.code===province.value)?.name,
		}
		let cityData = {
			code: city.value,
			name: selectCitys.value.find(item => item.code===city.value)?.name,
		}
		let areaData = {
			code: area.value,
			name: selectAreas.value.find(item => item.code===area.value)?.name
		}
		emit('change',{
			provinceData,
			cityData,
			areaData
		})
	}
  })


  </script>
  
相关推荐
汪子熙3 分钟前
聊一聊 TypeScript 里的类型别名
前端·javascript
DONG9137 分钟前
Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
开发语言·汇编·数据结构·python·算法·青少年编程·排序算法
R-G-B16 分钟前
【C++ 初级工程师面试--4】形参带默认值的函数,特点,效率,注意事项
开发语言·c++·形参带默认值的函数·形参默认值特点,效率,注意事项·形参默认值特点·形参默认值效率·形参默认值注意事项
西岭千秋雪_16 分钟前
前端工程化:npm&vite
前端·javascript·npm·node.js
BUG收容所所长26 分钟前
HoverMask与SelectedMask——如何让低代码平台的交互体验更加直观?
前端·javascript·设计
Q_Q51100828536 分钟前
python的驾校培训预约管理系统
开发语言·python·django·flask·node.js·php
Mintopia42 分钟前
🌐AIGC:从硅芯片中孕育的缪斯女神
前端·javascript·aigc
掘金安东尼1 小时前
⏰前端周刊第425期(2025年7月28日–8月3日)
前端·javascript·面试
namehu1 小时前
为什么我的margin-top被转换为vw而不是vh?
javascript·css·postcss
雪中何以赠君别1 小时前
Vite + Axios + Nginx 环境变量与代理配置笔记
前端·javascript·vue.js