上一篇
上周产品经理小张跑来问我:"老王啊,咱们有个新需求,用户只需要选择单个省或市或区,不要那种三级联动的效果,能实现吗?"
我微微一笑:"当然可以!这种'不联动'的省市区选择在实际项目中还挺常见的呢!"
传统的省市区选择组件通常是三级联动的——选择省份后加载城市,选择城市后加载区县,但有时候业务需求确实只需要:
首先我们需要一个完整的省市区数据源,这里我用简化版示例:
// areaData.js export default { provinces: [ { code: '11', name: '北京市' }, { code: '31', name: '上海市' } // ...其他省份 ], cities: { '11': [ // 北京下属城市 { code: '1101', name: '北京市' } ], '31': [ // 上海下属城市 { code: '3101', name: '上海市' } ] // ...其他城市 }, areas: { '1101': [ // 北京市下属区县 { code: '110101', name: '东城区' }, { code: '110102', name: '西城区' } // ...其他区 ], '3101': [ // 上海市下属区县 { code: '310101', name: '黄浦区' }, { code: '310104', name: '徐汇区' } // ...其他区 ] } }
<template> <div class="area-selector"> <!-- 选择级别 --> <select v-model="selectedLevel"> <option value="province">省份</option> <option value="city">城市</option> <option value="area">区县</option> </select> <!-- 根据级别显示对应选择器 --> <select v-model="selectedValue"> <option v-for="item in currentOptions" :key="item.code" :value="item.code" > {{ item.name }} </option> </select> </div> </template> <script> import areaData from './areaData.js' export default { data() { return { selectedLevel: 'province', selectedValue: '', areaData } }, computed: { currentOptions() { switch(this.selectedLevel) { case 'province': return this.areaData.provinces case 'city': return Object.values(this.areaData.cities).flat() case 'area': return Object.values(this.areaData.areas).flat() default: return [] } } } } </script>
如果需要更完善的体验,可以添加:
搜索过滤功能
// 在data中添加 searchText: '', // 在computed中修改 currentOptions() { let options = [] // ...之前的switch代码 // 添加过滤 if(this.searchText) { return options.filter(item => item.name.includes(this.searchText) ) } return options }
显示完整路径
// 添加方法 getFullPath(code) { if(this.selectedLevel === 'province') { const province = this.areaData.provinces.find(p => p.code === code) return province ? province.name : '' } // 其他级别类似处理... }
性能优化:当数据量大时,扁平化操作(Object.values().flat())可能影响性能,可以考虑分页加载
数据更新:如果数据需要从接口获取,记得添加loading状态
默认值处理:组件接收外部value时的处理要小心
移动端适配:在小屏幕上可以考虑使用弹出式选择器
这种非联动选择器特别适合:
通过这个方案,我们实现了一个灵活的非联动省市区选择器,关键点在于:
下次产品经理再提出"特殊"需求时,你就可以淡定地说:"这个简单,我有现成方案!" 😎
(本文实现方案基于2025年最新的Vue 3.4版本特性编写)
本文由 邶琦 于2025-07-30发表在【云服务器提供商】,文中图片由(邶琦)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/483194.html
发表评论