这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛。
虽然很简单的一个功能,但是网络上能搜索到的教程大多都是需要配合 elementUI 等各种 UI 库的,但是我的项目并没有使用这些 UI 库,何况我只是想要拿到 一个地址字符串 而已,何必绑定 UI 库呢?
1、地址三级联动制作思路
思路其实很简单:
1、一个地图 json 数据
2、能够拿到 省份、市、区 的 options 数组来绑定就可以了
3、选择一个省份市,对应的市要变化;选择市时,对应的区要变化
这样的话,我们完全可以依赖 vue 强大的数据处理机制来解决
2、地图json
地图json数据我随便搜了一个: 中国省市区数据
3、vue setup 语法糖写法
我们点击上面的链接,下载了地图json数据,这里选择一个普通的就可以了,如图:
将文件命名为 area.json ,然后在项目中引入:
// 详细地址(省市区 详细地址) import areaObj from '../../public/area.json';
第一步:首先是处理省份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] })
这里同样默认选中第一个,当市变化时,区也会切换到对应的市区数据
4、效果
完美!
这样,就可以不借助任何第三方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('')
本文转载于:
https://juejin.cn/post/7297983578548355099
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容