Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点

必要准备

1. 查询行政区划的接口

可以使用提供的API  行政区域查询-API文档-开发指南-Web服务 API | 地图API

获取高德开发的key 的方法,详见博客  地图开发 —— 获取地图开发的 key_朝阳39的博客-CSDN博客_地图开发平台的key

2. 在 vue.config.js 中配置接口代理

// 访问高德地图的API
'/gaodeMapAPI': {
    target: 'https://restapi.amap.com',
    changOrigin: true,
    ws: true,  // 是否启用websockets
    secure: true,
    pathRewrite: {
        '^/gaodeMapAPI': ''
    }
},

范例1 —— 级联选择行政区划(可以选择任意一级)

要点

1. 使用懒加载   lazy: true

2. lazyLoad 函数中无法直接获取到this,所有需在 data(){} 函数中,使用  let that = this

3. 最终选中的结果为一个数组,内容依次是省、市、区的行政区划代码

4. 通过在  props 中添加 checkStrictly: true 实现级联单选,从而可以选择任意一级

5. 从接口中获取到的结果,需要转换成级联选择器需要的数据格式,值存入value,可见的内容存入 label,当 leaf 赋值为true 时,得到最后一级。

( 范例中的接口必须指定 leaf  为true 的条件 item.level === "district" ,否则可以无限级联选择  )

( 另外,因范例中的接口返回的街道数据的行政区划代码是其上级的区/县的行政区划代码,所以不支持级联选择到街道)

<template>
    <div style="padding: 20px">
        <p>当前选中的行政区划编码为: {{regionCodeList}}</p>
        <el-cascader  v-model="regionCodeList" :props="props"></el-cascader>
    </div>
</template>
<script>
    export default {
        data() {
            let that = this
            return {
                regionCodeList: [],
                props: {
                    // 单选
                    checkStrictly: true,
                    // 懒加载
                    lazy: true,
                    lazyLoad(node, resolve) {
                        that.$http.get("/gaodeMapAPI/v3/config/district", {
                            params: {
                                keywords: node.value,
                                subdistrict: '1',
                                key: 'f7c1ee410753e832aad78bc5cf135351'
                            }
                        })
                            .then(res => {
                                let nodes = res.data.districts[0].districts.map(item => {
                                    return {
                                        value: item.adcode,
                                        label: item.name,
                                        leaf: item.level === "district"
                                    }
                                })
                                resolve(nodes)
                            })
                    }
                }
            }
        },
    }
</script>
<style scoped>
</style>

范例2 —— 限制行政区划的显示和选择范围

需求

1. 默认选中深圳市

2. 不能选择省,但可以选择深圳市,或者深圳市内的区

3. 不显示广东省和深圳市之外的省和市

要点

1. v-model 绑定默认值,便能实现默认选中

2. 在添加 node 时,添加  disabled: true 便可使该节点不可选

3. 在添加 node 时,通过if 判断,过滤掉不显示的省和市

<template>
    <div style="padding: 20px">
        <p>当前选中的行政区划编码为: {{regionCodeList}}</p>
        <el-cascader v-model="regionCodeList" :props="props"></el-cascader>
    </div>
</template>
<script>
    export default {
        data() {
            let that = this
            return {
                regionCodeList: ["440000", "440300"],
                props: {
                    // 单选
                    checkStrictly: true,
                    // 懒加载
                    lazy: true,
                    lazyLoad(node, resolve) {
                        that.$http.get("/gaodeMapAPI/v3/config/district", {
                            params: {
                                keywords: node.value,
                                subdistrict: '1',
                                key: 'f7c1ee410753e832aad78bc5cf135351'
                            }
                        })
                            .then(res => {
                                let districtsList = res.data.districts[0].districts
                                let nodes = []
                                districtsList.forEach(item => {
                                    if ((item.level === "province") && (item.adcode === "440000")) {
                                        nodes.push(
                                            {
                                                value: item.adcode,
                                                label: item.name,
                                                disabled: true
                                            }
                                        )
                                    } else if ((item.level === "city") && (item.adcode === "440300")) {
                                        nodes.push(
                                            {
                                                value: item.adcode,
                                                label: item.name,
                                            }
                                        )
                                    } else if (item.level === "district") {
                                        nodes.push(
                                            {
                                                value: item.adcode,
                                                label: item.name,
                                                leaf: item.level === "district"
                                            }
                                        )
                                    }
                                })
                                resolve(nodes)
                            })
                    }
                }
            }
        },
    }
</script>
<style scoped>
</style>

范例3 —— 获取选中行政区划的名称

要点

1.  绑定 change 事件,触发获取行政区划信息的代码

<el-cascader ref="chooseRegionDom" @change="getRegionInfo"  v-model="regionCodeList" :props="props"></el-cascader>

3.  解析选中的节点(节点数组中下标为 0  的节点为选中的节点)

getRegionInfo(){
    // 获取选中的nodeList
    let nodeList = this.$refs.chooseRegionDom.getCheckedNodes()
    // 解析node的label 和 value
    this.$set(this.regionInfo,'regionName',nodeList[0].label)
    this.$set(this.regionInfo,'regionCode',nodeList[0].value)
}

目录
相关文章
|
1天前
|
前端开发
Element UI 【实战】纯前端对表格数据进行增删改查(内含弹窗表单、数据校验、时间日期格式)
Element UI 【实战】纯前端对表格数据进行增删改查(内含弹窗表单、数据校验、时间日期格式)
22 6
|
1天前
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
10 1
|
1天前
Element UI【组件拓展】el-datetime-picker-before 禁止选择未来时间的日期时间选择器(精确到时分秒)
Element UI【组件拓展】el-datetime-picker-before 禁止选择未来时间的日期时间选择器(精确到时分秒)
8 1
|
1天前
Element UI 源码改造 —— 自定义数字输入框的实现
Element UI 源码改造 —— 自定义数字输入框的实现
5 1
|
1天前
Element UI 数字输入框的实现
Element UI 数字输入框的实现
7 0
|
1天前
Element UI 树形控件Tree 【详解】el-tree 展开指定节点,判断是否存在指定节点
Element UI 树形控件Tree 【详解】el-tree 展开指定节点,判断是否存在指定节点
5 0
|
1天前
【亲测有效】Element UI 自定义 Notification 通知样式不生效,设置this.$notify样式不生效问题
【亲测有效】Element UI 自定义 Notification 通知样式不生效,设置this.$notify样式不生效问题
5 0
|
1天前
element UI实现输入建议下拉列表 —— el-select filterable可筛选的下拉列表 or 带输入建议的输入框 el-autocomplete ?
element UI实现输入建议下拉列表 —— el-select filterable可筛选的下拉列表 or 带输入建议的输入框 el-autocomplete ?
5 0
|
1天前
【详细流程】vue+Element UI项目中使用echarts绘制圆环图 折线图 饼图 柱状图
【详细流程】vue+Element UI项目中使用echarts绘制圆环图 折线图 饼图 柱状图
5 0
|
1天前
Element UI 表单【详解】-- 表单校验,表单元素排列在一行,常用表单元素等
Element UI 表单【详解】-- 表单校验,表单元素排列在一行,常用表单元素等
5 0

推荐镜像

更多