封装一个省市区公共组件

难点:封装一个省市区三级联动的公共组件,难点在与对三级嵌套数据的处理,其中三级嵌套数据来源于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>
  
相关推荐
竹林8181 小时前
用 wagmi v2 + viem 监听链上事件,我踩了三天坑终于搞懂了实时日志与历史补全
javascript
只一1 小时前
😭从回调地狱到 async/await:一文打通 Ajax 与 JS 异步编程
javascript
weedsfly1 小时前
语法糖褪去之后——Babel 转译产物中的 JavaScript 本貌
前端·javascript
JustHappy1 小时前
「软件设计思想杂谈🤔」“切图仔”也能懂编译原理?框架源码也许没那么难。聊聊 Vue 的编译(上)
前端·javascript·vue.js
晓得迷路了2 小时前
栗子前端技术周刊第 134 期 - React Router v8、TypeScript 7 RC、React Native 0.86...
前端·javascript·react.js
代码煮茶18 小时前
React 组件封装方法论 —— 以 Todo App 为例
javascript·react.js
任沫18 小时前
Agent之Function Call
javascript·人工智能·go
默_笙19 小时前
🛬 我让 AI 帮我写了一个打飞机游戏,结果 Canvas 把我整不会了
前端·javascript
梯度不陡19 小时前
AI 到底能不能从零写软件?ProgramBench 和 RepoZero 给出了两种答案
前端·javascript·面试
胡萝卜术21 小时前
滑动窗口最大值:从暴力到单调队列,层层优化全解析
前端·javascript·面试