Element-UI省市区(县)三级联动---基于VUX移动框架的x-address组件

本文介绍如何使用Element-UI实现省市区(县)三级联动功能,通过解析Vux的x-address组件中包含的全国省市区数据,实现与之相似的联动效果。文章详细展示了如何利用axios读取JSON数据,并通过正则表达式筛选省市县信息,最后通过Vue的v-model和v-for指令完成联动选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Element-UI 省市区(县)三级联动

由于公司移动端使用的是Vux的UI框架,该框架有x-address组件,其中包含了省市县的数据,通过Element-UI实现与其相同的省市区(县)三级联动。

Vux中x-address对全国省市区的数据进行了封装,引入不同版本的JSON文件展示不同的内容,这里我引入的是V4版本(最新版本)的JSON数据,JSON格式如下图:

在这里插入图片描述省相关数据在这里插入图片描述

思路:在此我列举了省市县的数据,相关数据下载,很明显省市区有各自的特性
1. 省的value是0000结尾;
2. 市的value是00结尾;同时又parent字段对应相应的省;
3. 区(县)parent字段对应的相应的市
直接上干货,相应的代码如下展示
HTML
<template>
  <div>
    <el-select v-model="valueProvince"
               placeholder="请选择省"
               @change="changeProvince">
      <el-option
        v-for="item in provinceList"
        :key="item.value"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-select>
    <el-select v-model="valueCity"
               placeholder="请选择市"
               @change="changeCity">
      <el-option
        v-for="item in cityOptions"
        :key="item.value"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-select>
    <el-select v-model="valueOrigin"
               placeholder="请选择区"
               @change="changeOrigin">
      <el-option
        v-for="item in originOptions"
        :key="item.value"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-select>
  </div>
</template>
JS
import axios from 'axios'
export default {
  name: 'HelloWorld',
  data () {
    return {
      provinceList: [], // 省列表
      cityList: [], // 市列表
      originList: [], // 区列表
      valueProvince: '', // 所选的省
      valueCity: '', // 所选的市
      valueOrigin: '', // 所选的区
      cityOptions: [], // 市下拉框数据
      originOptions: [] // 区下拉框数据
    }
  },
  methods: {
    // 选择省
    changeProvince(val) {
      this.provinceList.forEach((province, index) => {
        if (val.toString() === this.provinceList[index].value) {
          this.cityOptions = this.provinceList[index].children
          this.valueCity = this.provinceList[index].children[0].value
          this.originOptions = this.provinceList[index].children[0].children
          this.valueOrigin = this.provinceList[index].children[0].children[0].value
        }
      })
    },
    // 选择市
    changeCity(val) {
      this.cityList.forEach((city, index) => {
        if (val.toString() === this.cityList[index].value) {
          this.originOptions = this.cityList[index].children
          this.valueOrigin = this.cityList[index].children[0].value
        }
      })
    },
    // 选择区
    changeOrigin(val) {
      this.valueOrigin = val
    },
    _getJsonData() {
      axios.get('../../static/china_address_v4.json').then((res) => {
        this.provinceList = []
        this.cityList = []
        this.originList = []
        res.data.forEach((item) => {
          if (item.value.match(/0000$/)) {
            this.provinceList.push({
              value: item.value,
              label: item.name,
              children: []
            })
          } else if (item.value.match(/00$/)) {
            this.cityList.push({
              value: item.value,
              label: item.name,
              children: []
            })
          } else {
            this.originList.push({
              value: item.value,
              label: item.name
            })
          }
        })
        for (let index in this.provinceList) {
          for (let index1 in this.cityList) {
            if (this.provinceList[index].value.slice(0, 2) === this.cityList[index1].value.slice(0, 2)) {
              this.provinceList[index].children.push(this.cityList[index1])
            }
          }
        }
        for(let item1 in this.cityList) {
          for(let item2 in this.originList) {
            if (this.originList[item2].value.slice(0, 4) === this.cityList[item1].value.slice(0, 4)) {
              this.cityList[item1].children.push(this.originList[item2])
            }
          }
        }
      })
    }
  },
  created() {
    this._getJsonData()
  }
}

这里我使用axios读取json文件,基于我之前的思路,遍历数据并正则匹配相应的数据(4个0对应省,2个0对应市,其他为区),添加至相应的数组中。

注意

  1. 静态文件存储路径,小心404报错。
  2. 数据类型没有对应上。由于Element-UI的el-select组件中有change事件,默认参数是value,它的类型是Number;而解析json文件出来的数据类型是String。

感谢作者棋鬼王的博客,https://blog.youkuaiyun.com/qq_32113629/article/details/79536177

vux 省市数据 内容描述: export const address=[{ name: "北京市", parent: "0", value: "110000" }, { name: "北京市", parent: "110000", parentAreaName: "北京市", value: "110100" }, { name: "东城区", parent: "110100", parentAreaName: "北京市", value: "110101" }, { name: "西城区", parent: "110100", parentAreaName: "北京市", value: "110102" }, { name: "朝阳区", parent: "110100", parentAreaName: "北京市", value: "110105" }, { name: "丰台区", parent: "110100", parentAreaName: "北京市", value: "110106" }, { name: "石景山区", parent: "110100", parentAreaName: "北京市", value: "110107" }, { name: "海淀区", parent: "110100", parentAreaName: "北京市", value: "110108" }, { name: "门头沟区", parent: "110100", parentAreaName: "北京市", value: "110109" }, { name: "房山区", parent: "110100", parentAreaName: "北京市", value: "110111" }, { name: "通州区", parent: "110100", parentAreaName: "北京市", value: "110112" }, { name: "顺义区", parent: "110100", parentAreaName: "北京市", value: "110113" }, { name: "昌平区", parent: "110100", parentAreaName: "北京市", value: "110114" }, { name: "大兴区", parent: "110100", parentAreaName: "北京市", value: "110115" }, { name: "怀柔区", parent: "110100", parentAreaName: "北京市", value: "110116" }, { name: "平谷区", parent: "110100", parentAreaName: "北京市", value: "110117" }, { name: "密云区", parent: "110100", parentAreaName: "北京市", value: "110118" }, { name: "延庆区", parent: "110100", parentAreaName: "北京市", value: "110119" }]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值