iview+vue 省市区三级联动

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"
                    @click.native="optionsChangeProvince(items.provinceName)"
                    >{{ items.provinceName }}</Option>
                </Select>
              </Col>
              <Col span="8">
                <Select
                  v-model="model.cityName"
                  placeholder="市"
                  clearable
                  style="width: 150px"
                  @on-change="optionsChangeCity($event)">
                  <Option
                    v-for="o in cityOptions"
                    :value="o.cityName"
                    :key="o.cityCode"
                    @click.native="optionsChangeCity(o.cityName)"
                    >{{ o.cityName }}</Option>
                </Select>
              </Col>
              <Col span="8">
                <Select
                  @on-change="optionsChangeCounties($event)"
                    v-model="model.countyName"
                    placeholder="区/县"
                    clearable
                    style="width: 150px">
                    <Option
                      v-for="o in countiesOptions"
                      :value="o.countyName"
                      :key="o.countyCode"
                      @click.native="optionsChangeCounties(o.countyName)"
                      >{{ o.countyName }}</Option>
                  </Select>
              </Col>
            </Row>
          </FormItem>
//导入
import {address} from '@/libs/address';
//接收
mounted(){
    this.addressOptions = address
    console.log(this.addressOptions,'地址')
  },
//选取省份时的事件
optionsChangeProvince (e) {
      let _this = this
      let item
      _this.addressOptions.forEach((ele, i) => {
        if (ele.provinceName === e) { //将选取的省份到省份里去比对,有值则给到当前item
          item = ele
          console.log(item, '省item')
        }
        if (item) {
          this.cityOptions = item.cities // 将选中item的城市名称给cityOption
          this.model.countyName = ''  //这两步是用来当市区发生变化时置空县/区
          this.countiesOptions = []
        }
      })
    },
    //选取城市时的事件
    optionsChangeCity (e) {
      this.model.cityName = e
      console.log(this.model.cityName,'this.model.cityName')
      let _this = this
      let item
      if (!_this.cityOptions) {  //这一步是用来判断是否存在市区,否则不让其遍历
        return
      }
      _this.cityOptions.forEach((ele, i) => {
        if (ele.cityName === e) {
          item = ele
          console.log(item, '市item')
        }
        if (item) {
          this.countiesOptions = item.counties // 将选中item的矿机批次给batchNumList
          this.model.countyName = item.counties[0].countyName // 默认选择第一个区/县名称
          console.log(this.countiesOptions,'区')
          console.log(this.model.countyName,'this.model.countyName')
        }
      })
    },
    //选取县/区时的事件
    optionsChangeCounties (e) {
      console.log('输出', e)
    },

到这里基本上已经实现选取值并回显到下拉框中

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
1. 首先,在项目中引入iviewvue-resource: ``` import Vue from 'vue' import iView from 'iview' import 'iview/dist/styles/iview.css' import VueResource from 'vue-resource' Vue.use(iView) Vue.use(VueResource) ``` 2. 在vue文件中使用iview的Select组件实现省市选择: ``` <template> <div> <Select v-model="province" @on-change="getCityList"> <Option v-for="(item, index) in provinceList" :value="item.id" :key="index">{{ item.name }}</Option> </Select> <Select v-model="city"> <Option v-for="(item, index) in cityList" :value="item.id" :key="index">{{ item.name }}</Option> </Select> </div> </template> <script> export default { data () { return { province: '', city: '', provinceList: [], cityList: [] } }, mounted () { this.getProvinceList() }, methods: { // 获取省份列表 getProvinceList () { this.$http.get('/api/province').then(res => { this.provinceList = res.data }) }, // 获取城市列表 getCityList () { this.$http.get('/api/city', { params: { province: this.province } }).then(res => { this.cityList = res.data }) } } } </script> ``` 3. 在后台实现省市数据接口: 省份接口: ``` app.get('/api/province', function(req, res) { res.json([ {id: 1, name: '北京'}, {id: 2, name: '上海'}, {id: 3, name: '广东省'}, {id: 4, name: '湖南省'} ]) }) ``` 城市接口: ``` app.get('/api/city', function(req, res) { var provinceId = req.query.province var cityList = [] switch(provinceId) { case '1': cityList = [ {id: 101, name: '北京市'}, {id: 102, name: '海淀区'}, {id: 103, name: '朝阳区'}, {id: 104, name: '东城区'}, {id: 105, name: '西城区'} ] break case '2': cityList = [ {id: 201, name: '上海市'}, {id: 202, name: '浦东新区'}, {id: 203, name: '徐汇区'}, {id: 204, name: '黄浦区'}, {id: 205, name: '静安区'} ] break case '3': cityList = [ {id: 301, name: '广州市'}, {id: 302, name: '深圳市'}, {id: 303, name: '珠海市'}, {id: 304, name: '佛山市'}, {id: 305, name: '东莞市'} ] break case '4': cityList = [ {id: 401, name: '长沙市'}, {id: 402, name: '株洲市'}, {id: 403, name: '湘潭市'}, {id: 404, name: '衡阳市'}, {id: 405, name: '邵阳市'} ] break default: break } res.json(cityList) }) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值