Vue2+element 地区选择器组件

下载地区数据

npm install element-china-area-data -S

具体代码

<template>
    <div>
        <el-select v-model="selectedProvince" placeholder="请选择省份" @change="handleProvinceChange">
            <el-option v-for="province in provinceData" :key="province.value" :label="province.label"
                :value="province.value"></el-option>
        </el-select>
        -
        <el-select v-model="selectedCity" placeholder="请选择城市" :disabled="!selectedProvince" @change="handleCityChange">
            <el-option v-for="city in cityData" :key="city.value" :label="city.label" :value="city.value"></el-option>
        </el-select>
        -
        <el-select v-model="selectedDistrict" placeholder="请选择区县" :disabled="!selectedCity" @change="handleInputChange">
            <el-option v-for="district in districtData" :key="district.value" :label="district.label"
                :value="district.value"></el-option>
        </el-select>
    </div>
</template>
  
<script>
import { regionData } from "element-china-area-data";

export default {
    name: 'AreaSelect',
    props: {
        value: [String, Object, Array],
    },
    data() {
        return {
            regionData,
            selectedProvince: '',
            selectedCity: '',
            selectedDistrict: '',
            provinceData: this.convertToOptions(regionData),
            cityData: [],
            districtData: [],
        };
    },
    watch: {
        value: {
            deep: true,
            immediate: true,
            handler(val) {
                if (val) {
                    if (val) {
                        const [selectedProvince, selectedCity, selectedDistrict] = val.split(',');
                        this.selectedProvince = selectedProvince;
                        this.selectedCity = selectedCity;
                        this.selectedDistrict = selectedDistrict;
                    }
                } else {
                    this.selectedProvince = '';
                    this.selectedCity = '';
                    this.selectedDistrict = '';
                }
            }
        }
    },
    methods: {
        convertToOptions(data) {
            return data.map(item => ({
                value: item.value,
                label: item.label,
            }));
        },
        handleProvinceChange() {
            const selectedProvinceData = this.regionData.find(item => item.value === this.selectedProvince);
            this.cityData = selectedProvinceData ? this.convertToOptions(selectedProvinceData.children) : [];
            this.districtData = [];
            this.selectedCity = '';
            this.selectedDistrict = '';
        },
        handleCityChange() {
            const selectedProvinceData = this.regionData.find(item => item.value === this.selectedProvince);
            const selectedCityData = selectedProvinceData.children.find(item => item.value === this.selectedCity);
            this.districtData = selectedCityData ? this.convertToOptions(selectedCityData.children) : [];
            this.selectedDistrict = '';
        },
        handleInputChange() {
            const selectedProvinceLabel = this.regionData.find(item => item.value === this.selectedProvince)?.label || '';
            const selectedCityLabel = this.cityData.find(item => item.value === this.selectedCity)?.label || '';
            const selectedDistrictLabel = this.districtData.find(item => item.value === this.selectedDistrict)?.label || '';

            const result = selectedProvinceLabel + ',' + selectedCityLabel + ',' + selectedDistrictLabel
            // const result = {
            //     province: selectedProvinceLabel,
            //     city: selectedCityLabel,
            //     district: selectedDistrictLabel,
            // };
            console.log(result)
            this.$emit("input", result);
        }
    },
};
</script>
<style scoped>
::v-deep .el-select--medium{
    width: 180px;
}
</style>
  

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值