在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛。
虽然很简单的一个功能,但是网络上能搜索到的教程大多都是需要配合 elementUI 等各种 UI 库的,但是我的项目并没有使用这些 UI 库,何况我只是想要拿到 一个地址字符串 而已,何必绑定 UI 库呢?
1、地址三级联动制作思路
思路其实很简单:
1、一个地图 json 数据
2、能够拿到 省份、市、区 的 options 数组来绑定就可以了
3、选择一个省份市,对应的市要变化;选择市时,对应的区要变化
这样的话,我们完全可以依赖 vue 强大的数据处理机制来解决
2、地图json
地图json数据我随便搜了一个: 中国省市区数据
3、vue setup 语法糖写法
我们点击上面的链接,下载了地图json数据,这里选择一个普通的就可以了,如图:
将文件命名为 area.json ,然后在项目中引入:
vue3 setup 中国省市区三级联动options最简洁写法,无需任何库
第一步:首先是处理省份options数组(这里json地图是键名为省份):
// 省 const provinceArr = Object.keys(areaObj) const province = ref(provinceArr[0])
这样就拿到了一个省份数组,这里随机默认选中第一个,北京市,这里 province 变量用来绑定输入框的值
第二步:处理市的数据,关键就是使用计算属性来监听 省份的变化,省份一改变,市的数据也会跟着改变:
// 市 const cityArr = computed(() => { return Object.keys(areaObj[province.value]) }) const city = ref(cityArr.value[0]) // 监听省份变化 watch(province, (newVal) => { city.value = Object.keys(areaObj[newVal])[0]; });
同样,这里的市默认选中第一个,city 也是双向绑定到 输入框, 为了能够在页面随时响应式改变,添加了一个watch 监听
第三步:处理区的数据
// 区 const areaArr = computed(() => { return areaObj[province.value][city.value] }) const area = ref(areaArr.value[0]) // 监听市变化 watch(city, (newVal) => { area.value = areaObj[province.value][newVal][0] })
这里同样默认选中第一个,当市变化时,区也会切换到对应的市区数据
3、效果
完美!
这样,就可以不借助任何第三方UI库,直接使用 vue 的计算属性和监听简单解决地图三级联动问题,就是数据的处理而已
以下是完整的代码:
其中 provinceArr、cityArr、areaArr 绑定options选项,province、city、area 绑定input 输入框
import { ref, computed, watch } from 'vue'; // 详细地址(省市区 详细地址) import areaObj from '../../../../public/area.json'; // 省 const provinceArr = Object.keys(areaObj) const province = ref(provinceArr[6]) // 市 const cityArr = computed(() => { return Object.keys(areaObj[province.value]) }) const city = ref(cityArr.value[0]) // 监听省份变化 watch(province, (newVal) => { city.value = Object.keys(areaObj[newVal])[0]; }); // 区 const areaArr = computed(() => { return areaObj[province.value][city.value] }) const area = ref(areaArr.value[0]) // 监听市变化 watch(city, (newVal) => { area.value = areaObj[province.value][newVal][0] }) // 详细地址 const detailArea = ref('')
猜你喜欢
- 16天前(三亚海棠湾君悦度假酒店)三亚海棠湾君悦酒店暑期夏令营悦趣海岛游招募中
- 16天前(郭富城热舞劲歌演唱会)郭富城年度压轴《新濠尊属系列郭富城梦幻舞林演唱会2023》
- 16天前(哥伦比亚号邮轮)爱达邮轮与哥仑比亚船舶管理集团达成合作
- 16天前(甘肃文旅项目)甘肃省文旅产业链招商引资推介会在天水成功举办
- 16天前(天气预报 华为)2025HDC华为天气上新系统级天气智能体,引领更智能的气象服务
- 16天前(中国旅游集团旗下酒店)中国旅游集团酒店控股有限公司战略投资雅阁酒店集团
- 16天前(天津四季酒店开业时间)天津四季酒店邀你开启灿烂暑假
- 16天前(星级饭店的发展困境)星级饭店转型之路:从市场逻辑到行业实践的深度探索
- 16天前(大黄山景区高质量发展联盟成立多少年)大黄山景区高质量发展联盟成立
- 16天前(新西兰登陆《我的世界》!全球首个目的地游戏模组震撼上线)新西兰登陆《我的世界》!全球首个目的地游戏模组震撼上线
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章