微信小程序省市区级联选择
# 原生小程序官方插件没有提供自定义数据的级联插件
# wxml文件
<view class="area-picker">
<picker mode="multiSelector" bindcancel="cancelArea" bindchange="onPickerChange" bindcolumnchange="onColumnChange" value="{{pickerIndex}}" range="{{pickerData}}">
<view class="serach_view-right">
<text class="ellipsis"> {{selectedArea || '请选择地区'}}</text>
<image src=""></image>
</view>
</picker>
</view>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# js文件
Component({
properties: {
areaData:{
type: Array,
value: []
}
// 可以添加自定义属性
},
data: {
pickerData: [[], [], []],
pickerIndex: [0, 0, 0],
selectedArea: '',
provinces: [],
cities: [],
districts: [],
},
lifetimes: {
attached() {
},
},
methods: {
initAreaData() {
const provinces = this.properties.areaData.map(province => ({
code: province.code,
name: province.name,
}));
this.setData({
provinces,
pickerData: [
provinces.map(p => p.name),
[],
[],
],
});
this.updateCities(0);
this.updateDistricts(0);
},
updateCities(provinceIndex) {
const cities = this.properties.areaData[provinceIndex].children.map(city => ({
code: city.code,
name: city.name,
}));
this.setData({
cities,
'pickerData[1]': cities.map(c => c.name),
});
},
updateDistricts(cityIndex) {
const { pickerIndex } = this.data;
const districts = this.properties.areaData[pickerIndex[0]].children[cityIndex].children.map(district => ({
code: district.code,
name: district.name,
}));
this.setData({
districts,
'pickerData[2]': districts.map(d => d.name),
});
},
onColumnChange(e) {
const { column, value } = e.detail;
const { pickerIndex } = this.data;
pickerIndex[column] = value;
if (column === 0) {
this.updateCities(value);
this.updateDistricts(0);
pickerIndex[1] = 0;
pickerIndex[2] = 0;
} else if (column === 1) {
this.updateDistricts(value);
pickerIndex[2] = 0;
}
this.setData({ pickerIndex });
},
cancelArea() {
this.setData({ selectedArea:'' });
this.triggerEvent('areachange', {
province: {
code:'',
name:''
},
city: {
code:'',
name:''
},
district: {
code:'',
name:''
},
});
},
onPickerChange(e) {
const { value } = e.detail;
const { provinces, cities, districts } = this.data;
const selectedArea = `${districts[value[2]].name}`;
this.setData({ selectedArea });
this.triggerEvent('areachange', {
province: provinces[value[0]],
city: cities[value[1]],
district: districts[value[2]],
});
},
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# css文件
.serach_view-right {
font-family: Alibaba PuHuiTi-Bold;
font-weight: bold;
font-size: 32rpx;
color: #26293C;
line-height: 40rpx;
display: flex;
align-items: center;
padding-right: 40rpx;
padding-top: 24rpx;
padding-bottom: 24rpx;
}
.serach_view-right image {
width: 28rpx;
height: 28rpx;
margin-left: 10rpx;
}
.serach_view-right text {
display: inline-block;
width: 160rpx;
text-align: right;
}
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
上次更新: 2024/08/17, 20:43:29