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

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

const areaList=[
{
name:'河南',
id:,
parentId:
},{
name:'浙江',
id:,
parentId:
},{
name:'郑州',
id:,
parentId:
},{
name:'新乡',
id:,
parentId:
},{
name:'洛阳',
id:,
parentId:
},{
name:'二七区',
id:,
parentId:
},{
name:'金水区',
id:,
parentId:
},{
name:'高新区',
id:,
parentId:
},{
name:'中原区',
id:,
parentId:
},{
name:'封丘县',
id:,
parentId:
},{
name:'原阳县',
id:,
parentId:
},{
name:"延津县",
id:,
parentId:
},{
name:'获嘉县',
id:,
parentId:
},{
name:'孟津县',
id:,
parentId:
},{
name:'新安县',
id:,
parentId:
},{
name:'杭州市',
id:,
parentId:
},{
name:'台州市',
id:,
parentId:
},{
name:'西湖区',
id:,
parentId:
},{
name:'滨江区',
id:,
parentId:
},{
name:'余杭区',
id:,
parentId:
},{
name:'椒江区',
id:,
parentId:
},{
name:'黄岩区',
id:,
parentId:
}
];
module.exports = areaList;

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

const areaList=require('../../utils/arealist.js');
Page({
data: {
multiArray: [],
multiIndex: [, , ],
province:[]
},
bindMultiPickerChange: function (e) {
console.log('picker发送选择改变,携带值为', e.detail.value)
this.setData({
multiIndex: e.detail.value
})
},
bindMultiPickerColumnChange: function (e) {
console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
var data = {
multiArray: this.data.multiArray,
multiIndex: this.data.multiIndex
};
data.multiIndex[e.detail.column] = e.detail.value;
const provinceName=data.multiArray[][data.multiIndex[]];
let provinceId="";
let province = this.data.province;
let quyuList = [], cityList = [], provinceList=[],city=[],area=[];
try {
province.forEach(item => {
if (item.name === provinceName) {
provinceId = item.id;
throw (new Error('find item'))
}
})
} catch (err) {
}
city = areaList.filter(item => {
return item.parentId == provinceId;
})
if (e.detail.column==){
data.multiIndex=[e.detail.value,,];
try{
area = areaList.filter(item => {
return item.parentId == city[data.multiIndex[]].id;
})
}catch(err){}
} else if (e.detail.column == ){
data.multiIndex[]=;
area = areaList.filter(item => {
return item.parentId == city[e.detail.value].id;
})
}else{
const cityName = data.multiArray[][data.multiIndex[]];
let cityId='';
try{
areaList.forEach(item=>{
if(item.name===cityName){
cityId=item.id;
throw(new Error('find item'));
}
})
}catch(err){}
area=areaList.filter(item=>{
return item.parentId==cityId;
})
}
provinceList = province.map(item => {
return item.name
})
cityList = city.map(item => {
return item.name;
})
quyuList = area.map(item => {
return item.name;
})
data.multiArray= [provinceList, cityList, quyuList],
this.setData(data);
},
onLoad(){
var province = [], city = [], area = [];
province=areaList.filter(item => {
return item.parentId == ;
})
city = areaList.filter(item => {
return item.parentId == province[].id;
})
area = areaList.filter(item => {
return item.parentId == city[].id;
})
var provinceList = province.map(item => {
return item.name
})
var cityList = city.map(item => {
return item.name;
})
var quyuList = area.map(item => {
return item.name;
})
this.setData({
multiArray: [provinceList, cityList, quyuList],
province
})
}
})

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

<view class="section">
<view class="section__title">多列选择器</view>
<picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">
<view class="picker">
当前选择:{{multiArray[][multiIndex[]]}},{{multiArray[][multiIndex[]]}},{{multiArray[][multiIndex[]]}}
</view>
</picker>
</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. CSS——简写属性(在padding和margin这样的简写属性中,值赋值的顺序是top、right、bottom、left)

    /* 在padding和margin这样的简写属性中,值赋值的顺序是top.right.bottom.left. 它们还有其他简写方式,例如给padding两个值,则第一个值表示top/bottom, ...

  2. Java-收邮件

    import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail. ...

  3. BZOJ 2243: [SDOI2011]染色 (树剖+线段树)

    树链剖分后两个区间合并的时候就判一下相交颜色是否相同来算颜色段数就行了. CODE #include <vector> #include <queue> #include &l ...

  4. left join和right join和inner join

    此图仅限于理解他们之间的关系,下面还有举例,例子更好明白. left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) 返回包括右表中的所有记录 ...

  5. javaScript高级程序设计第3版笔记

    <script src = "xxx.js" defer = "defer"> </script> 在引用外部script时,<s ...

  6. hdu 5726 GCD GCD+线段树+区间预处理+map

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  7. 关于项目在网页中运行部分jsp出现乱码(由request.getRequestDispatcher("XXX.jsp").forward(request, response)造成)的解决方法

    在写jsp的时候发现部分的jsp在浏览器预览时出现乱码,为一堆问号,如图: 当时问了同学,只有部分jsp会出现乱码,因为重新建一个jsp在运行就没有错误,可以显示出来,所以发现是jsp头部的错误,当新 ...

  8. (70)一篇文章带你熟悉 TCP/IP 协议

    作者:涤生_Woo链接:http://www.jianshu.com/p/9f3e879a4c9c來源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 同样的,本文篇幅也比较 ...

  9. 25.Python逻辑运算符及其用法

    逻辑运算符是对真和假两种布尔值进行运算(操作 bool 类型的变量.常量或表达式),逻辑运算的返回值也是 bool 类型值. Python 中的逻辑运算符主要包括 and(逻辑与).or(逻辑或)以及 ...

  10. node链接mongoDB及封装

    // 这个模块中封装所有对数据库的常用操作 const MongoClient = require('mongodb').MongoClient; const assert = require('as ...