iview+vue 省市区三级联动

本文介绍如何利用iview组件库的Select组件,结合JSON数据,实现在Vue项目中省市区三级联动的功能。通过监听on-change事件,动态更新市、区/县的选择选项,确保数据的联动和回显。

iview+vue 省市区三级联动

利用iview的下拉框实现三级联动功能在这里插入图片描述
省市区的所有数据是一个json文件。类似于这种格式的,自己可以在项目里引入(需要可以留言)
在这里插入图片描述

话不多说上代码首先在data中定义初始化变量,我是为了方便将省市区的变量放到model对象里,然后定义addressOptions的数组接受省市区的所有数据,cityOptions是用来接受市的数组,countiesOptions是用来接收县或者区的数据,

model: {
   
   
        provinceName:'',//省
        cityName:'',//市
        countyName:'' ,//区
      },
      addressOptions:[],//城市三级联动数据
      cityOptions:[], //市
      countiesOptions:[],//县/区

下面展示template模块

<FormItem label="所在城市" required>
            <Row>
              <Col span="8">
                <Select
                  @on-change="optionsChangeProvince($event)"
                  v-model="model.provinceName"
                  placeholder="省"
                  clearable
                  style="width: 150px">
                  <Option
                    v-for="items in addressOptions"
                    :value="items.provinceName"
                    :key="items.provinceCode"
       
Vue2 项目中使用 iView 实现省市区三级联动选择功能,可以通过组合使用 `iView` 的 `Select` 和 `Option` 组件来实现。具体思路是通过数据绑定和事件监听实现级联更新。 ### 数据结构设计 首先定义一个包含省份、城市、区县的数据结构。可以使用嵌套对象或数组来表示: ```javascript data() { return { provinces: [ { value: 'zhejiang', label: '浙江省', children: [ { value: 'hangzhou', label: '杭州市', children: [ { value: 'xihu', label: '西湖区' }, { value: 'yuhang', label: '余杭区' } ] }, { value: 'ningbo', label: '宁波市', children: [ { value: 'haishu', label: '海曙区' }, { value: 'jiangbei', label: '江北区' } ] } ] }, { value: 'jiangsu', label: '江苏省', children: [ { value: 'nanjing', label: '南京市', children: [ { value: 'qinhuai', label: '秦淮区' }, { value: 'xuanwu', label: '玄武区' } ] } ] } ], selectedProvince: '', selectedCity: '', selectedDistrict: '' }; } ``` ### 省份选择器 ```html <template> <div> <Select v-model="selectedProvince" placeholder="请选择省份" @on-change="handleProvinceChange"> <Option v-for="province in provinces" :key="province.value" :value="province.value"> {{ province.label }} </Option> </Select> <Select v-model="selectedCity" placeholder="请选择城市" @on-change="handleCityChange" :disabled="!selectedProvince"> <Option v-for="city in cities" :key="city.value" :value="city.value"> {{ city.label }} </Option> </Select> <Select v-model="selectedDistrict" placeholder="请选择区县" :disabled="!selectedCity"> <Option v-for="district in districts" :key="district.value" :value="district.value"> {{ district.label }} </Option> </Select> </div> </template> ``` ### 方法逻辑实现 ```javascript methods: { handleProvinceChange(provinceValue) { const province = this.provinces.find(p => p.value === provinceValue); this.cities = province ? province.children : []; this.selectedCity = ''; this.selectedDistrict = ''; }, handleCityChange(cityValue) { const city = this.cities.find(c => c.value === cityValue); this.districts = city ? city.children : []; this.selectedDistrict = ''; } } ``` ### 样式与优化 为了增强用户体验,可以为下拉框添加一些样式,例如宽度调整和禁用状态的视觉反馈: ```css <style scoped> .Select { width: 200px; margin-right: 10px; } </style> ``` ### 动态数据加载(可选) 如果数据量较大或者需要从后端获取数据,可以在每次选择时发起请求获取下一级数据[^1]。这种方式需要处理异步操作,比如使用 `axios` 或其他 HTTP 客户端进行请求。 ---
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值