前端vue+element-ui 表单 省市区的输入及所传参数 __Vue.js__Element
发布于 3 年前 作者 banyungong 1447 次浏览 来自 分享
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

前端出现表单有省市区选择、且后端需要省市区编码时

  • 省市区采用elementui的级联组件
  • 数据采用 “编码-名称”json文件封装成固定形式的数组形式—“ChinaAreaOptions”
  • “ChinaAreaRef”—获取选取到哪一级的级联
  • 设置在 :props="{ checkStrictly: true }"可以实现任意选择一级
<el-form-item class="item-30" label="省市区" prop="areaDataValue"> 
    <div class="block"> 
        <el-cascader 
          v-model="areaDataValue" 
          ref="ChinaAreaRef" 
          placeholder="请选择" 
          :props="{ checkStrictly: true }" 
          :options="ChinaAreaOptions" 
          filterable 
          :disabled="orderUnDisabled" 
          clearable >
        </el-cascader> 
    </div>
</el-form-item>

而element-ui级联所需要的数据的格式(我们需要手动转换)为:

ChinaAreaOptions: [
    { 
        value: '', 
        label: '浙江省', 
        children: [
            { 
                value: '', 
                label: '杭州市', 
                children: [
                    { 
                        value: '', 
                        label: '西湖区' 
                    }, 
                    { 
                        value: '', 
                        label: '' 
                    }, 
                ] 
            }, 
            { 
                value: '', 
                label: '宁波市', 
                children: [
                    { 
                        value: '', 
                        label: '市辖区' 
                    }, 
                    { 
                        value: '', 
                        label: '海曙区' 
                    }
                ] 
            },
            ...
        ] 
    }, 
    {
        value: '', 
        label: '广东省', 
        children: [
            ...
        ]
    }
    ...
]

现有 省市区统一正确的编码json文件,格式如下(可在网上获取完整版),所以需要把此json文件转为上述的数组格式

{
    "areaData": [
        {
            "86": {
                "110000": "北京市",
                "120000": "天津市",
                "130000": "河北省",
                "140000": "山西省",
                "150000": "内蒙古自治区",
                "210000": "辽宁省",
                "220000": "吉林省",
                "230000": "黑龙江省",
                "310000": "上海市",
                "320000": "江苏省",
                "330000": "浙江省",
                "340000": "安徽省",
                "350000": "福建省",
                "360000": "江西省",
                "370000": "山东省",
                "410000": "河南省",
                "420000": "湖北省",
                "430000": "湖南省",
                "440000": "广东省",
            },
            "330000": {
                "330100": "杭州市",
                "330200": "宁波市",
                "330300": "温州市",
                "330400": "嘉兴市",
                "330500": "湖州市",
                "330600": "绍兴市",
                "330700": "金华市",
                "330800": "衢州市",
                "330900": "舟山市",
                "331000": "台州市",
                "331100": "丽水市"
            },
            "330100": {
                "330101": "市辖区",
                "330102": "上城区",
                "330103": "下城区",
                "330104": "江干区",
                "330105": "拱墅区",
                "330106": "西湖区",
                "330108": "滨江区",
                "330109": "萧山区",
                "330110": "余杭区",
                "330111": "富阳区",
                "330112": "临安区",
                "330122": "桐庐县",
                "330127": "淳安县",
                "330182": "建德市"
            }
        }
    ]
}

编写 省市区json数据 转 级联数据格式数组 (处理省市区数据)的封装方法:

function getAreaList(areaList) {
    const root = []
    let obj = {}
    let districtObj = {}
    const areaObj = areaList[0] // 所有的数据       
    const rootEle = areaList[0]['86'] // 获取到省的数据      
    let childrenList = []
    let countryList = []
    let countryObj = {}
    // 遍历取得省的数据中的所有键     
    for (var rootKey in rootEle) {
        // 遍历取得所有的数据的键,以"编码"这个键 对上 某省数据中的"编码"键           
        for (var key in areaObj) {
            childrenList = [] // 存放该省的 市数据 
            // 如果所有数据中某个编码键 等于 省数据中的编码键,即隶属于该省 
            if (key == rootKey) {                
                // areaObj[rootKey] 指的是 所有数据中 某个省的所有市数据
                for (var childrenKey in areaObj[rootKey]) {//遍历取得该省的所有市编码
                    countryList = [] // 存放该省某市的 所有区数据
                    // 遍历取得该省某市的所有区编码                    
                    for (var countrykeys in areaObj[childrenKey]) {
                        countryObj = {
                            value: countrykeys,
                            label: areaObj[childrenKey][countrykeys]
                        }
                        countryList.push(countryObj)
                    }
                    districtObj = {
                        value: childrenKey,
                        label: areaObj[rootKey][childrenKey], //表示此省此市
                        children: countryList
                    }
                    childrenList.push(districtObj)
                }
                obj = {
                    value: rootKey,
                    label: rootEle[rootKey],
                    children: childrenList
                } // 该省的数据                        
                root.push(obj) // 将所有的省数据 放进数组               
            }
        }
    }
    console.log('省市区:', root)
    return root
}

开始转换数据:获取省市区json编码的areaData,并以参数的形式执行上述方法,得到级联组件所需要的那种数据格式。

// 获得级联所需的数据形式 ----即上述的ChinaAreaOptions
this.ChinaAreaOptions = getAreaList(areaData) 

在表单中需要的 选取省市区 以及 进入表单需选中某个省市区(渲染数据)

//element组件里的 getCheckedNodes 获取选中的节点
// 对选中的省市区 根据编码相等 封装成对象
function getCascaderObj(val, opt) {    
    return val.map(function (value, index) {        
        for (var itm of opt) {
            // 在所有的省市区编码上找到 选中的省市区编码            
            if (itm.value == value) {                
                opt = itm.children                
                return itm           
            }        
        }        
        return null    
    })
}

不规定用户需要选齐省市区,即可以选一个省、或者一个省和旗下的市、或者选齐省市区

var nodes = this.$refs['ChinaAreaRef'].getCheckedNodes()[0].path
if (nodes) {
    let nodesObj = this.getCascaderObj(nodes, this.ChinaAreaOptions)
    if (nodesObj.length === 1) {
        this.orderEditForm.Province = nodesObj[0].label
        this.orderEditForm.City = ''
        this.orderEditForm.Area = ''
        this.orderEditForm.ProvinceCode = nodesObj[0].value
        this.orderEditForm.CityCode = ''
        this.orderEditForm.AreaCode = ''
    }
    if (nodesObj.length === 2) {
        this.orderEditForm.Province = nodesObj[0].label
        this.orderEditForm.City = nodesObj[1].label
        this.orderEditForm.Area = ''
        this.orderEditForm.ProvinceCode = nodesObj[0].value
        this.orderEditForm.CityCode = nodesObj[1].value
        this.orderEditForm.AreaCode = ''
    }
    if (nodesObj.length === 3) {
        this.orderEditForm.Province = nodesObj[0].label
        this.orderEditForm.City = nodesObj[1].label
        this.orderEditForm.Area = nodesObj[2].label
        this.orderEditForm.ProvinceCode = nodesObj[0].value
        this.orderEditForm.CityCode = nodesObj[1].value
        this.orderEditForm.AreaCode = nodesObj[2].value
    }
}
const postData = { ...this.orderEditForm }
postData.LoginName = ''
// postData.LoginName = this.LoginUserNo.loginUserNo
console.log('添加客户', postData)

得到的this.orderEditForm即是我们需要发给后端的表单数据啦!!

进入表单所在页面,如果需要将后台返回的数据渲染到表单的话,看第一段代码中的prop=“areaDataValue”,后台返回了一个省市区编码的数组returnData,并将其赋值给areaDataValue。

if (this.returnData.ProvinceCode) {
    this.areaDataValue = [this.returnData.ProvinceCode]
    if (this.returnData.CityCode) {
        this.areaDataValue.push(this.returnData.CityCode)
        if (this.returnData.AreaCode) {
            this.areaDataValue.push(this.returnData.AreaCode)
        }
    }
}
```<p style="line-height: 20px; color: #ccc">
        版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
        作者: 阿焘
        原文链接:<a href='https://juejin.im/post/7026358708296744996'>https://juejin.im/post/7026358708296744996</a>
      </p>
回到顶部