中国行政区划选择器的一些讨论合集

in 前端 with 0 comment

讨论网址https://www.v2ex.com/t/495507#reply10
also24

既然说起这个了,就顺便提一下详细的建议吧

大部分情况下,可以认为我国存在五级行政区划:
省 -> 市 -> 县 -> 乡 -> 村

每一级又存在部分不同名但同级的单位:直辖市、自治区、县级市、街道 之类的
大部分情况下,我们用到 乡 /镇 /街道 一级,也就是四级区划。

但是实际执行中,存在各种 “特例”,于是就产生了几个警察容易出坑的地方:

1、直辖市辖区虽然行政上属于厅局级,但是行政区划上属于县级,相当于少了一级地级单位
也就是:直辖市 - 空缺地级 - 直辖市辖区 - 直辖市辖区街道
这个不用举例了,四个直辖市都这样

2、省直管县其实是 “正统”,但是由于少了地级市 “代管”,也相当于少了一级地级单位
也就是:省 - 空缺地级 - 省直管县 / 省直管县级市 - 省管县下辖乡镇街道
这个就是我上面举例的一大堆,典型就是济源市

3、全国有五个 “直筒子市”,不设区县,地级市直接管理乡镇街道级别,相当于少了一级县级单位
也就是:省 - 直筒子地级市 - 空缺县级 - 直筒子地级市下辖街道 /镇
这个就是我上面提到的五个城市:中山 东莞 嘉峪关 三沙 儋州

关于这三种特殊情况的处理,可以看到第一种楼主已经处理了,采取的是 city 字段 null 的形式,同时会自动删减一级菜单。
第二第三种应该是没有处理,会导致找不到济源市、以及中山市选不到下级街道的问题。

个人建议为了保证兼容性,应该强行插入一级来保证每个字段都能取到值:

北京市 - 北京市 - 东城区 - 东华门街道 (虚拟地级北京市)
河南省 - 济源市 - 济源市 - 沁园街道 (虚拟地级济源市)
广东省 - 中山市 - 中山市 - 石岐区街道 (虚拟县级中山市)

这样可以保证 city area 字段均有值,方便开发者实现相应逻辑,也解决了删减菜单带来的跳动问题。

如果担心省辖县过多导致臃肿,也可以虚拟一级 “省辖县 /省辖县级市” 来集合:
河南省 - 省辖县 /省辖县级市 - 济源市 - 沁园街道 (虚拟地级 省辖县 /省辖县级市)
但是这样也会带来缺陷,开发者获取 city 字段时获取到的信息会无意义。

参考资料:
https://zhuanlan.zhihu.com/p/31774163
仔细看其实可以看出,京东压根不显示 “省 /市 /区 /县” 的分级,这样就只需要考虑树形结构,不需要考虑区划层级了。

而淘宝 和 v-region,都已经有了区划层级展示,导致不得不给具体的地名一个 “名分”。

淘宝的处理是,四个直辖市虚拟了一级 “市”,但用户选择的时候,会自动选择并跳过。
直筒子市 和 省直管县级市 /省直管县 都展示为 “市” 一级,同时 “区” 无法点击选择。
其实还是略为奇怪的(市一级为什么会混入县)。


参考以上实现,我的建议是:
数据层面上,需要使用虚拟层级的方式,不论 UI 上如何展示,数据方面都通过虚拟一级单位的方式写满字段,不应出现 null 的情况,这样便于开发者做地名判断(开发者可能并不会去关注 北京市 - 济源市 - 中山市 的区别,而希望都能在 city 字段中进行处理)

UI 层面上,我更倾向于淘宝在直辖市上的实现方案,即无论如何都保留四个层级不变,但当该层级是虚拟的,导致只有一个选项的时候,自动帮用户选择,直接进入下一级。

我前面提到五级,只是从行政区划的角度,实际中我感觉基本上只要处理到 县 /镇 /街道办 一级,就可以解决大部分问题了。
Comments are closed.