在element plus中使用checkbox 多选框实现大区省市区选择回选

1.产品拿来淘宝后台页面,希望我们的快递发货也用这一套

  长这样:

 

2.后端说提供的数据是树形结构,大区id不要传,传省的id,勾选哪个传哪个

3.element  ui的树形插件和级联选择器在数据上是可以实现的,但是ui应该不行,最后决定用checkbox 多选框自己写一个

4.el-checkbox 主要是indeterminate属性(控制中间状态)和 v-mode显示是否被显示

5.数据来源:最初是后端返回的树形结构数据,后面发现太旧。改用vant的省市区数据

1
npm i @vant/area-data

 引入,再转为原来的树形结构:

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// 省市区转树形结构
import { areaList } from '@vant/area-data'
 console.log(areaList);
 
 
export const location = () => {
    let areaData:any= {
        province:[],
        city:[],
        area:[]
    }
    for (let key in areaList.province_list) {
        areaData.province.push({
            name:areaList.province_list[key],
            code:key
        })
    }
    for (let key in areaList.city_list) {
        areaData.city.push({
            name:areaList.city_list[key],
            code:key
        })
    }
    for (let key in areaList.county_list) {
        areaData.area.push({
            name:areaList.county_list[key],
            code:key
        })
    }
    return areaData
}
export const locations = () => {
    let datas: any = []
    let data: any = [
        {
            areaName: '华北',
            childrenList: [],
            coding: 1000000,
            id: 1,
            level: 0,
            parentId: 0
        },
        {
            areaName: '东北',
            childrenList: [],
            coding: 2000000,
            id: 2,
            level: 0,
            parentId: 0
        },
        {
            areaName: '华东',
            childrenList: [],
            coding: 3000000,
            id: 3,
            level: 0,
            parentId: 0
        },
        {
            areaName: '华南',
            childrenList: [],
            coding: 4000000,
            id: 4,
            level: 0,
            parentId: 0
        },
        {
            areaName: '华中',
            childrenList: [],
            coding: 8000000,
            id: 8,
            level: 0,
            parentId: 0
        },
        {
            areaName: '西南',
            childrenList: [],
            coding: 5000000,
            id: 5,
            level: 0,
            parentId: 0
        },
        {
            areaName: '西北',
            childrenList: [],
            coding: 6000000,
            id: 6,
            level: 0,
            parentId: 0
        },
        {
            areaName: '港澳台',
            childrenList: [],
            coding: 7000000,
            id: 7,
            level: 0,
            parentId: 0
        }
    ]
 
 
 
    for (let key in areaList.province_list) {
        datas.push({
            areaName: areaList.province_list[key],
            childrenList: [],
            coding: Number(key),
            id: Number(key.slice(0, 2)),
            level: 1,
            parentId: (key == '410000' || key == '420000' || key == '430000') ? 8000000 : (key == '810000' || key == '820000') ? 7000000 : Number(key.slice(0, 1)+'000000')
        })
 
    }
    datas.map((item: any) => {
        for (let key in areaList.city_list) {
            if (key.slice(0, 2) == item.id) {
                item.childrenList.push({
                    areaName: areaList.city_list[key],
                    childrenList: [],
                    coding: Number(key),
                    id: Number(key.slice(0, 4)),
                    level: 2,
                    parentId: item.coding
                })
            }
 
 
        }
    })
    datas.map((item: any) => {
        item.childrenList && item.childrenList.length > 0 && item.childrenList.map((child: any) => {
            for (let key in areaList.county_list) {
                if (child.id == key.slice(0, 4)) {
                    child.childrenList.push({
                        areaName: areaList.county_list[key],
                        childrenList: [],
                        coding: Number(key),
                        id: Number(key),
                        level: 3,
                        parentId: child.coding
                    })
                }
            }
        })
    })
 
    data.map((item: any) => {
        datas.map((child: any) => {
            if (item.coding == child.parentId) {
                item.childrenList.push(child)
            }
        })
    })
    let result =[data,datas]
     
    return result
}
export const areaData = locations()[0]
export const areaRegion = locations()[1]
export const areaListData = location()

  在组件页面引入,最终效果:

 代码地址:https://gitee.com/yuexiayunsheng/vue3learn.git

posted @   月下云生  阅读(2003)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-12-21 leaflet在vue中标记点(marker)的三种方式
2021-12-21 在vue中使用leaflet加载地图
点击右上角即可分享
微信分享提示