Vue實現省市區級聯下拉選擇框

本文實例為大傢分享瞭Vue實現省市區級聯下拉選擇框的具體代碼,供大傢參考,具體內容如下

以(Vue下拉選擇框Select組件二)為基礎實現省市區級聯下拉選擇框組件

(業務需要,固定省份選擇為貴州,沒有此業務,不傳disabled屬性即可)

效果圖如下:

 ①創建級聯下拉選擇Cascader.vue組件

<template>
  <div class="m-cascader-wrap">
    <Select
      class="mr10"
      :style="`z-index: ${zIndex};`"
      mode="region"
      :disabled="true"
      :selectData="provinceData"
      :selValue="address.province"
      :width="84"
      placeholder="請選擇省"
      @getValue="getProvinceCode" />
    <Select
      class="mr10"
      :style="`z-index: ${zIndex};`"
      mode="region"
      :selectData="cityData"
      :selValue="address.city"
      :width="172"
      placeholder="請選擇市"
      @getValue="getCityCode" />
    <Select
      mode="region"
      :style="`z-index: ${zIndex};`"
      :selectData="areaData"
      :selValue="address.area"
      :width="172"
      placeholder="請選擇區"
      @getValue="getAreaCode" />
  </div>
</template>
<script>
import Select from '@/components/Select'
import { dictByType } from '@/api/index'
export default {
  name: 'Cascader',
  components: {
    Select
  },
  props: {
    selectedAddress: { // 省市區初始值
      type: Object,
      default: () => {
        return {}
      }
    },
    zIndex: {
      type: Number,
      default: 1
    }
  },
  data () {
    return {
      provinceData: [
        {
          dictVal: '貴州省',
          dictKey: 'P29'
        }
      ],
      cityData: [],
      areaData: [],
      regionParams: {
        type: '1',
        parentDictKey: ''
      },
      address: {
        province: 'P29',
        city: this.selectedAddress.city || '',
        area: this.selectedAddress.area || ''
      },
      addressName: {
        provinceName: '貴州省',
        cityName: '',
        areaName: ''
      },
      initialCity: true
    }
  },
  created () {
    this.getCity('P29')
    console.log('address:', this.address)
  },
  methods: {
    getCity (key) { // 獲取市數據
      this.regionParams.parentDictKey = key
      dictByType(this.regionParams).then(res => {
        console.log('city-res:', res)
        if (res.message.code === 0) {
          if (res.data.dataList) {
            this.cityData = res.data.dataList
            if (this.initialCity && this.address.city) {
              this.initialCity = false
              this.cityData.forEach(item => {
                if (item.dictKey === this.address.city) {
                  this.getArea(item.dictKey)
                }
              })
            }
            console.log('cityData:', this.cityData)
          }
        }
      })
    },
    getArea (key) { // 獲取區數據
      this.regionParams.parentDictKey = key
      dictByType(this.regionParams).then(res => {
        console.log('area-res:', res)
        if (res.message.code === 0) {
          if (res.data.dataList) {
            this.areaData = res.data.dataList
            console.log('areaData:', this.areaData)
          }
        }
      })
    },
    getProvinceCode (name, key) {
      console.log('province:', name, key)
    },
    getCityCode (name, key) {
      console.log('city:', name, key)
      this.address.city = key
      this.addressName.cityName = name
      this.$emit('getAddress', {}, {})
      // 獲取區下拉列表
      this.getArea(key)
    },
    getAreaCode (name, key) {
      console.log('area:', name, key)
      this.address.area = key
      this.addressName.areaName = name
      this.$emit('getAddress', this.address, this.addressName)
    }
  }
}
</script>
<style lang="less" scoped>
.m-cascader-wrap {
  display: inline-block;
  width: 449px;
  height: 40px;
  line-height: 40px;
}
</style>

②在要使用的頁面引入:

<Cascader
  :selectedAddress="register"
  mode="region"
  :zIndex="997"
  @getAddress="getRegisterAddress" />
import Cascader from '@/components/Cascader'
components: {
    Cascader
},
data () {
  return {
    register: {
      province: this.data.registerProvinceCode,
      city: this.data.registerCityCode,
      area: this.data.registerAreaCode
    } || {},
  }
}
methods: {
  getRegisterAddress (address, addressName) {
    console.log('register-address:', address)
    this.register = address
    if (JSON.stringify(addressName) !== '{}') { // 用於提交表單
      this.addParams.registerProvinceName = addressName.provinceName
      this.addParams.registerCityName = addressName.cityName
      this.addParams.registerAreaName = addressName.areaName
    }
    if (JSON.stringify(address) !== '{}') { // 用於校驗下拉表單是否未選擇
      this.checkFocus('register')
    }
  }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: