最近在做一个项目的时候遇到了这么一个问题,就是省市区的联动呢,我们需要自定义字典来设置,那么微信小程序自带的省市区选择就不能用了,经过三根烟的催化,终于写出来了。下面献上代码示例。

  首先是在utils文件夹存入arealist.js文件,内容为:

  1. const areaList=[
  2. {
  3. name:'河南',
  4. id:,
  5. parentId:
  6. },{
  7. name:'浙江',
  8. id:,
  9. parentId:
  10. },{
  11. name:'郑州',
  12. id:,
  13. parentId:
  14. },{
  15. name:'新乡',
  16. id:,
  17. parentId:
  18. },{
  19. name:'洛阳',
  20. id:,
  21. parentId:
  22. },{
  23. name:'二七区',
  24. id:,
  25. parentId:
  26. },{
  27. name:'金水区',
  28. id:,
  29. parentId:
  30. },{
  31. name:'高新区',
  32. id:,
  33. parentId:
  34. },{
  35. name:'中原区',
  36. id:,
  37. parentId:
  38. },{
  39. name:'封丘县',
  40. id:,
  41. parentId:
  42. },{
  43. name:'原阳县',
  44. id:,
  45. parentId:
  46. },{
  47. name:"延津县",
  48. id:,
  49. parentId:
  50. },{
  51. name:'获嘉县',
  52. id:,
  53. parentId:
  54. },{
  55. name:'孟津县',
  56. id:,
  57. parentId:
  58. },{
  59. name:'新安县',
  60. id:,
  61. parentId:
  62. },{
  63. name:'杭州市',
  64. id:,
  65. parentId:
  66. },{
  67. name:'台州市',
  68. id:,
  69. parentId:
  70. },{
  71. name:'西湖区',
  72. id:,
  73. parentId:
  74. },{
  75. name:'滨江区',
  76. id:,
  77. parentId:
  78. },{
  79. name:'余杭区',
  80. id:,
  81. parentId:
  82. },{
  83. name:'椒江区',
  84. id:,
  85. parentId:
  86. },{
  87. name:'黄岩区',
  88. id:,
  89. parentId:
  90. }
  91. ];
  92. module.exports = areaList;

  然后在需要的页面引入地区字典,并且在onLoad的时候解析字典,遍历出一级数据,留备后用。

  1. const areaList=require('../../utils/arealist.js');
  2. Page({
  3. data: {
  4. multiArray: [],
  5. multiIndex: [, , ],
  6. province:[]
  7. },
  8. bindMultiPickerChange: function (e) {
  9. console.log('picker发送选择改变,携带值为', e.detail.value)
  10. this.setData({
  11. multiIndex: e.detail.value
  12. })
  13. },
  14. bindMultiPickerColumnChange: function (e) {
  15. console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
  16. var data = {
  17. multiArray: this.data.multiArray,
  18. multiIndex: this.data.multiIndex
  19. };
  20. data.multiIndex[e.detail.column] = e.detail.value;
  21. const provinceName=data.multiArray[][data.multiIndex[]];
  22. let provinceId="";
  23. let province = this.data.province;
  24. let quyuList = [], cityList = [], provinceList=[],city=[],area=[];
  25. try {
  26. province.forEach(item => {
  27. if (item.name === provinceName) {
  28. provinceId = item.id;
  29. throw (new Error('find item'))
  30. }
  31. })
  32. } catch (err) {
  33. }
  34. city = areaList.filter(item => {
  35. return item.parentId == provinceId;
  36. })
  37. if (e.detail.column==){
  38. data.multiIndex=[e.detail.value,,];
  39. try{
  40. area = areaList.filter(item => {
  41. return item.parentId == city[data.multiIndex[]].id;
  42. })
  43. }catch(err){}
  44. } else if (e.detail.column == ){
  45. data.multiIndex[]=;
  46. area = areaList.filter(item => {
  47. return item.parentId == city[e.detail.value].id;
  48. })
  49. }else{
  50. const cityName = data.multiArray[][data.multiIndex[]];
  51. let cityId='';
  52. try{
  53. areaList.forEach(item=>{
  54. if(item.name===cityName){
  55. cityId=item.id;
  56. throw(new Error('find item'));
  57. }
  58. })
  59. }catch(err){}
  60. area=areaList.filter(item=>{
  61. return item.parentId==cityId;
  62. })
  63. }
  64. provinceList = province.map(item => {
  65. return item.name
  66. })
  67. cityList = city.map(item => {
  68. return item.name;
  69. })
  70. quyuList = area.map(item => {
  71. return item.name;
  72. })
  73. data.multiArray= [provinceList, cityList, quyuList],
  74. this.setData(data);
  75. },
  76. onLoad(){
  77. var province = [], city = [], area = [];
  78. province=areaList.filter(item => {
  79. return item.parentId == ;
  80. })
  81. city = areaList.filter(item => {
  82. return item.parentId == province[].id;
  83. })
  84. area = areaList.filter(item => {
  85. return item.parentId == city[].id;
  86. })
  87. var provinceList = province.map(item => {
  88. return item.name
  89. })
  90. var cityList = city.map(item => {
  91. return item.name;
  92. })
  93. var quyuList = area.map(item => {
  94. return item.name;
  95. })
  96. this.setData({
  97. multiArray: [provinceList, cityList, quyuList],
  98. province
  99. })
  100. }
  101. })

  下面是wxml页面,想要看一下效果的可以直接贴去看下

  1. <view class="section">
  2. <view class="section__title">多列选择器</view>
  3. <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">
  4. <view class="picker">
  5. 当前选择:{{multiArray[][multiIndex[]]}},{{multiArray[][multiIndex[]]}},{{multiArray[][multiIndex[]]}}
  6. </view>
  7. </picker>
  8. </view>

  提示:在微信开发者工具中会出现一级目录选项改变二级目录的选项没有把index回置为0的问题,但是在真机调试的时候并未发现此问题。暂未找到相关解释

微信小程序省市区联动,自定义地区字典的更多相关文章

  1. 微信小程序页面调用自定义组件内的事件

    微信小程序页面调用自定义组件内的事件 page page.json { "usingComponents": { "my-component": ". ...

  2. 微信小程序底部实现自定义动态Tabbar

    多图警告!!! 最近在工作中遇到这样一个需求:微信小程序底部的Tab需要通过判断登录人的角色动态进行改变,想要实现这个功能依靠小程序原生的Tabbar是不可能实现的了,所以研究了一下自定义Tab,这里 ...

  3. mpvue + 微信小程序 picker 实现自定义多级联动 超简洁

    微信小程序官网只提供了省市区的三级联动,实际开发中更多的是自定义的多级联动: 依照微信小程序官网提供的自定义多级联动,需要使用到picker 的多列选择器,即设置 mode = multiSelect ...

  4. 微信小程序-多级联动

    微信小程序中的多级联动 这里用到的案例是城市选择器 先上代码: .wxml <view class="{{boxHide}}"> <view>{{nian} ...

  5. 微信小程序省市联动

    最近呢刚好做了一个省市联动的功能,今天看到有人问这个怎么做,我就把我做的放上来共享一下: 首先呢,来看看效果,点击文字'点击',弹出选择窗口,点击取消或者确定(取消.确定按钮在选择框上边,截图有些不清 ...

  6. 微信小程序分享支持自定义封面图

    微信小程序又发布更新了,刚好昨天支付宝也发布小程序,不能让它抢了风头的节奏.微信小程序主要更新如下:“小程序分享支持自定义封面图,公众号及小程序客服可发送小程序卡片.同时,我们还开放了获取发票抬头,指 ...

  7. 微信小程序中的自定义组件

    微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...

  8. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  9. 微信小程序数据分析之自定义分析

    在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计.访问分析.来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享 ...

随机推荐

  1. BZOJ3589 动态树[树剖/暴力/容斥]

    操作0,显然直接线段树解决. 操作1,瓶颈在于重叠的链只算一次.在线段树上来看,如果一个区间被覆盖了,那么只算这个区间,子树里面也就不管了. 考虑对节点打标记来表示是否覆盖.但是,如果统一打完之后,并 ...

  2. img标签的before,after伪类

    在CSS中总有一些你不用不知道,用到才知道的“坑”.比如今天要谈的,把 before, after 伪类用在 <img> 标签上.嗯,实际上你用你会发现,在大多数浏览器这是无效的,dom中 ...

  3. Eclipse指定jdk启动

    在eclipse.ini文件中加入这一句话: -vm D:/Java/jdk/jdk1.8/jre/bin/server/jvm.dll

  4. 15-资源等待类型sys.dm_os_wait_stats

    一.总结 1.网址 https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/ ...

  5. 使用choices参数的实际项目表设计

    # 实际项目表设计 from django.db import models # Create your models here. # rbac权限相关表格 class User(models.Mod ...

  6. mysql索引分类及实现原理

    索引分类:主键索引.唯一索引.普通索引.全文索引.组合索引 1.主键索引:即主索引,根据主键pk_clolum(length)建立索引,不允许重复,不允许空值 ALTER TABLE 'table_n ...

  7. yii 上传视频(ajax)

    实现一个功能:提交表单的时候,需要上传视频,把视频上传到oss上,然后把url作为表单值传到后端保存到数据库.需要ajax异步实现. 遇到了一个这样报错:Bad Request: 您提交的数据无法被验 ...

  8. MySQL的btree索引和hash索引区别

     在使用MySQL索引的时候, 选择b-tree还是hash hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范 ...

  9. VS的快捷操作

    连按两下Tab,生成代码块.修改i为n,再按一次Tab,对应位置自动改变. Ctrl+. 或者 Alt+Enter ctor  连按两下Tab,生成无返回值的构造函数(constructor func ...

  10. java+大文件上传+下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...