vue3 Ts ElementPlus组件封装(2) 封装省市区选择组件

1.使用到watch触发选择判断,defineEmits分发事件

这个组件功能并不复杂,我就直接上代码啦,只要循环时思想没有被拉扯,利用find()函数可以有效的提高代码可读性

组件代码

<template>
  <div>
    <el-select  clearable placeholder="请选择省份" v-model="province">
      <el-option v-for="item in areas" :key="item.code" :value="item.code" :label="item.name">
        
      </el-option>
    </el-select>
    <el-select  
     style="margin: 0 10px;"
     placeholder="请选择城市" 
     :disabled="!province"
     v-model="city">
      <el-option  v-for="item in selectCity" :key="item.code" :value="item.code" :label="item.name">

      </el-option>
    </el-select>
    <el-select   
    clearable :disabled="!province || !city"
    placeholder="请选择区域"
    v-model="area">
      <el-option v-for="item in selectArea" :key="item.code" :value="item.code" :label="item.name">
        
      </el-option>
    </el-select>
  </div>
</template>

<script lang="ts" setup>
  import { ref, watch } from 'vue'
  import allAreas from '../lib/pca-code.json'

  export interface AreaItem {
    name: string,
    code: string,
    children?: AreaItem[],
  }

  export interface Data {
    name: string,
    code: string
  }

  // 下拉框选择省份的值
  let province = ref<string>('')
  // 下拉框选择城市的值
  let city = ref<string>('')
  // 下拉框选择区域的值
  let area = ref<string>('')
  // 所有的省市区数据
  let areas = ref(allAreas)
  
  // 城市下拉框的所有的值
  let selectCity = ref<AreaItem[]>([])
  // 区域下拉框的所有的值
  let selectArea = ref<AreaItem[]>([])

  let emits = defineEmits(['change'])

  // 监听选择省份
  watch(() => province.value, val => {
    if (val) {
      let cities = areas.value.find(item => item.code === province.value)!.children!
      selectCity.value = cities
    }
    city.value = ''
    area.value = ''
  })
  
  // 监听选择城市
  watch(()=> city.value , val =>{
    if(val){
      console.log(city.value)
      let area = selectCity.value.find(item=> item.code === city.value)!.children
      selectArea.value = area
    }
    area.value = ''
  })

  // 监听选择区域
  watch(() => area.value, val => {
     if (val) {
      let provinceData: Data = {
        code: province.value,
        name: province.value && allAreas.find(item => item.code === province.value)!.name
      }
      let cityData: Data = {
        code: city.value,
        name: city.value && selectCity.value.find(item => item.code === city.value)!.name
      }
      let areaData: Data = {
        code: val,
        name: val && selectArea.value.find(item => item.code === val)!.name
      }
      emits('change', {
        province: provinceData,
        city: cityData,
        area: areaData
      })
    }
  })


</script>

页面调用

<template>
  <div>
    <m-choose-area @change="changeArea"></m-choose-area>
  </div>
</template>

<script lang='ts' setup>
let changeArea = (val: any) => {
  console.log(val)
}
</script>

git地址

https://github.com/rainswift/vue3-Ts-ElementPlus

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值