vue省市区 下拉框实现

vue省市区 下拉框实现

1.效果如图

C:\Users\DELL\AppData\Roaming\Typora\typora-user-images

选中省之后,再选择对应的市,再选择对应的区

数据源js文件:

码云:https://gitee.com/wyjpositive/mybatis-plus-demo/tree/master/src/main/resources/static

我是把里面的json文件改成js引入对应的项目的中
在这里插入图片描述

上代码:

①:引入省市区js

import jsonData from '@/assets/js/china_address.js'

②:编写省市区的下拉框

 <el-form-item label="所在地区">
               <el-select v-model="valueProvince"
               placeholder="请选择省"
               @change="changeProvince"
               style="width:120px">
                <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"
                        style="width:120px">
                <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" style="width:120px">
                <el-option
                  v-for="item in originOptions"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
                </el-option>
              </el-select>
        </el-form-item>

③:定义下拉框所需要数据

export default {
  components: {
    UploadImage
  },
  data() {
    return {
      provinceList: [], // 省列表
      cityList: [], // 市列表
      originList: [], // 区列表
      valueProvince: '', // 所选的省
      valueCity: '', // 所选的市
      valueOrigin: '', // 所选的区
      cityOptions: [], // 市下拉框数据
      originOptions: [],// 区下拉框数据
      }
    },
 }

④:编写js

  created() {
    this.getList()
    this._getJsonData()
    //console.log('jsonData:',jsonData)
  },
  methods: {

      // 选择省
    changeProvince(val) {
      this.provinceList.forEach((province, index) => {debugger
        if (val.toString() === this.provinceList[index].value) {
           this.cityOptions = this.provinceList[index].children
           this.valueCity = ''
           this.originOptions = this.provinceList[index].children[0].children
           this.valueCity = ''
           this.valueOrigin = ''
           // 如果选中省之后想市区默认选中
          // this.valueCity = this.provinceList[index].children[0].value
          // 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.valueOrigin = this.cityList[index].children[0].value
        }
      })
    },
    // 选择区
    changeOrigin(val) {
      this.valueOrigin = val
    },
    // 初始化省市区数据
    _getJsonData() {
        console.log('res =======>'+jsonData)
        this.provinceList = []
        this.cityList = []
        this.originList = []
        jsonData.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])
            }
          }
        }
    },

  },

地址的js中有部分不是简称。比如广西壮族自治区指广西省,有需要的自行修改

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
实现Vue省市区联动布局,可以按照以下步骤进行: 1. 创建Vue组件:首先,创建一个Vue组件来实现省市区联动布局。可以使用Vue-cli工具创建一个新的项目,然后在其中创建一个组件。 2. 数据准备:准备省市区的数据。可以使用JSON格式的数据,或者从后端接口获取数据。将数据存储在Vue组件的data属性中。 3. 布局设计:设计联动布局的样式,可以使用HTML和CSS来创建选择器和下拉框。 4. 绑定数据:将省市区的数据与下拉框进行绑定。使用v-model指令将选中的值绑定到Vue组件的data属性中。 5. 监听事件:监听省、市、区下拉框的变化事件。当省下拉框的值发生变化时,根据选中的省份,动态更新市下拉框的选项;当市下拉框的值发生变化时,动态更新区下拉框的选项。 6. 数据联动:根据用户选择的省、市、区,联动更新数据。可以使用计算属性或者观察者来实现数据的联动更新。 以下是一个简单的示例代码: ```html <template> <div> <select v-model="selectedProvince" @change="updateCities"> <option v-for="province in provinces" :key="province.id" :value="province.id">{{ province.name }}</option> </select> <select v-model="selectedCity" @change="updateDistricts"> <option v-for="city in cities" :key="city.id" :value="city.id">{{ city.name }}</option> </select> <select v-model="selectedDistrict"> <option v-for="district in districts" :key="district.id" :value="district.id">{{ district.name }}</option> </select> </div> </template> <script> export default { data() { return { provinces: [], // 省份数据 cities: [], // 城市数据 districts: [], // 区域数据 selectedProvince: '', // 选中的省份 selectedCity: '', // 选中的城市 selectedDistrict: '', // 选中的区域 }; }, mounted() { // 初始化数据,从后端接口获取省份数据 this.getProvinces(); }, methods: { getProvinces() { // 从后端接口获取省份数据,更新this.provinces }, getCities(provinceId) { // 根据省份ID从后端接口获取城市数据,更新this.cities }, getDistricts(cityId) { // 根据城市ID从后端接口获取区域数据,更新this.districts }, updateCities() { this.getCities(this.selectedProvince); this.selectedCity = ''; this.selectedDistrict = ''; }, updateDistricts() { this.getDistricts(this.selectedCity); this.selectedDistrict = ''; }, }, computed: { // 根据选中的省份和城市,过滤区域数据 filteredDistricts() { return this.districts.filter(district => district.cityId === this.selectedCity); }, }, }; </script> ``` 这是一个简单的示例代码,你可以根据你的实际需求进行修改和扩展。希望对你有帮助!
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值