封装一个省市区公共组件

难点:封装一个省市区三级联动的公共组件,难点在与对三级嵌套数据的处理,其中三级嵌套数据来源于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>
  
相关推荐
dialect_3 小时前
KMP算法
开发语言·c++·算法
jktantan4 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么4 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
前端精髓5 小时前
调用openrouter的免费API模型
java·前端·javascript
开开心心_Every6 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c6 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌6 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
超级架构师7 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮8 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔8 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节