Vue中使用el-select下拉框实现省、市、县地区三级联动功能,并定义@change事件进行区域名称和对应编码的动态赋值

一、页面显示效果图和显示显示的代码,如下:

<!-- provinceNameList:所有省份集合 provinceId:省份编码 provinceName:省份名称 -->
<!-- fnclIvt:按需求定义传后台的实体类 belongAreaName:保存provinceName的字段 -->
<!-- provinceNameList: 定义的省份集合 -->
<!-- cityNameList: 定义的城市集合集合 -->
<!-- countyNameList: 定义的乡镇集合集合 -->
<el-form-item label="所在地区" prop="region" class="city-select">
    <el-select v-model="fnclIvt.belongAreaName" placeholder="请选择所在省份"              
     @change="changeProvinceName">
       <el-option
            v-for="item in provinceNameList"
            :key="item.provinceId"
            :label="item.provinceName"
            :value="item.provinceId">
       </el-option>
    </el-select>
    <el-select v-model="fnclIvt.ivtStr2" placeholder="请选择所在市区" 
     @change="changeCityName">
       <el-option
            v-for="item in cityNameList"
            :key="item.cityId"
            :label="item.cityName"
            :value="item.cityId">
       </el-option>
    </el-select>
    <el-select v-model="fnclIvt.ivtStr4" placeholder="请选择所在县级" 
     @change="changeCountyName">
       <el-option
            v-for="item in countyNameList"
            :key="item.countyId"
            :label="item.countyName"
            :value="item.countyId">
       </el-option>
    </el-select>
</el-form-item>

二、下拉框中定义@change事件,目的有二:a.通过下拉框选择事件,及时给名称和对应的编码进行动态赋值;b.通过选择事件,实现地区三级联动,比如:你选择某个确定市之后(武汉市),县级下拉框的数据将是武汉市的下级区县,@change事件对应代码如下,是在methods中定义的:

methods: {
    //省份选择事件
    changeProvinceName(provinceId){
       let provinceObj = {}
       //这里的provinceNameList就是上面遍历的后台查出的省份集合
       provinceObj = this.provinceNameList.find((item)=>{
           //筛选出匹配数据
           return item.provinceId === provinceId 
       })
       //我这边的belongAreaName就是对应provinceName 
       this.fnclIvt.belongAreaCode = provinceId 
       this.fnclIvt.belongAreaName = provinceObj.provinceName
       //选择完省份后,调取后台方法,查询出该省份下所有的市
       selectSuitedAdrress(this.fnclIvt.belongAreaCode, "", "").then(res =>{
           if(res.msg == "successList"){
               //给城市集合重新赋值
               this.cityNameList = res.data
           }
       })
    },
    //城市选择事件
    changeCityName(cityId){
        let cityObj = {}
        //这里的cityNameList就是上面遍历的后台查出的城市集合
        cityObj = this.cityNameList.find((item)=>{
           //筛选出匹配数据
           return item.cityId === cityId
        })
        //我这边的ivtStr2就是对应cityName的 
        //赋值城市编码
        this.fnclIvt.ivtStr1 = cityId
        //赋值城市名称
        this.fnclIvt.ivtStr2 = cityObj.cityName
        //选择完城市后,调取后台方法,查询出该市下所有的区县
        selectSuitedAdrress("", this.fnclIvt.ivtStr1, "").then(res =>{
            if(res.msg == "successList"){
                //给区县集合重新赋值
                this.countyNameList = res.data
             }
        })
    },
    //乡镇选择事件
    changeCountyName(countyId){
        let countyObj = {}
        //这里的countyNameList就是上面遍历的后台查出的区县集合
        countyObj = this.countyNameList.find((item)=>{
            //筛选出匹配数据
            return item.countyId === countyId
        })
        //我这边的ivtStr4就是对应countyName的 
        //赋值乡镇编码
        this.fnclIvt.ivtStr3 = countyId
        //赋值乡镇名称 
        this.fnclIvt.ivtStr4 = countyObj.countyName
    }
}

三、当数据库中既要保存省、市、县名称,同时也要保存对应省、市、县的编码时,以上方法适用!!!

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是一个简单的三级联动Vue组件代码,使用了`el-select`组件实现: ```html <template> <div> <el-select v-model="selectedProvince" placeholder="请选择份" @change="provinceChange"> <el-option v-for="province in provinces" :key="province.code" :label="province.name" :value="province.code"></el-option> </el-select> <el-select v-if="selectedProvince" v-model="selectedCity" placeholder="请选择城" @change="cityChange"> <el-option v-for="city in cities" :key="city.code" :label="city.name" :value="city.code"></el-option> </el-select> <el-select v-if="selectedCity" v-model="selectedDistrict" placeholder="请选择区"> <el-option v-for="district in districts" :key="district.code" :label="district.name" :value="district.code"></el-option> </el-select> </div> </template> <script> export default { props: { citiesData: { type: Array, required: true }, selectedCode: { type: String, required: true } }, data() { return { provinces: this.citiesData, cities: [], districts: [], selectedProvince: '', selectedCity: '', selectedDistrict: '' } }, created() { // 初始化 this.initSelectedCode() }, methods: { initSelectedCode() { if (this.selectedCode) { const codes = this.selectedCode.split(',') if (codes.length === 3) { this.selectedProvince = codes[0] this.selectedCity = codes[1] this.selectedDistrict = codes[2] this.filterCities() this.filterDistricts() } } }, provinceChange() { this.filterCities() this.selectedCity = '' this.selectedDistrict = '' }, cityChange() { this.filterDistricts() this.selectedDistrict = '' }, filterCities() { const province = this.provinces.find(item => item.code === this.selectedProvince) if (province) { this.cities = province.children } }, filterDistricts() { const city = this.cities.find(item => item.code === this.selectedCity) if (city) { this.districts = city.children } } } } </script> ``` 这个组件接收两个props:`citiesData`和`selectedCode`,分别对应数据和已选区code值。`citiesData`是一个数组,包含了所有区的信息;`selectedCode`是一个字符串,包含了已选区的code值,用逗号分割。例如:"110000,110100,110101"。 在组件的data定义了三个变量:`provinces`、`cities`和`districts`,分别对应、区的数据。还定义了三个变量:`selectedProvince`、`selectedCity`和`selectedDistrict`,用于绑定已选区值。 在组件的created生命周期函数,初始化已选区值。 在组件的方法实现、区三级联动功能。每当份或城改变时,都会根据当前选的值更新下一级的选项。`filterCities`和`filterDistricts`方法分别用于过滤城和区的数据。`provinceChange`和`cityChange`方法分别用于处理份和城选项的改变事件。 在模板使用了`v-if`指令判断当前是否有选区,如果有,则显示相应的`el-select`组件。`v-for`指令用于循环渲染、区选项。`@change`事件用于监听选项的改变事件,触发相应的方法进行下一级选项的更新。`v-model`指令用于绑定选的值。 希望这个代码可以帮助到你。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值