searchDistPicker.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <!-- 可搜索的 distpicker(地区选择器) -->
  3. <div class="select-dist-picker">
  4. <!-- 省选择器 -->
  5. <el-select
  6. :placeholder="$t('SystemManage.DepartManage.user_add_placeholder10')"
  7. filterable
  8. v-model="province"
  9. value-key="provinceKey"
  10. :disabled="disabled"
  11. @change="handleSelectChange('province')"
  12. >
  13. <el-option
  14. v-for="province in provinceSource"
  15. :key="province.provinceKey"
  16. :label="province.provinceName"
  17. :value="province"
  18. />
  19. </el-select>
  20. <!-- 市选择器 -->
  21. <el-select
  22. :placeholder="$t('SystemManage.DepartManage.user_add_placeholder11')"
  23. filterable
  24. v-model="city"
  25. value-key="cityKey"
  26. :disabled="disabled"
  27. @change="handleSelectChange"
  28. >
  29. <el-option
  30. v-for="city in citySource"
  31. :key="city.cityKey"
  32. :label="city.cityName"
  33. :value="city"
  34. />
  35. </el-select>
  36. </div>
  37. </template>
  38. <script>
  39. import {province_sorce,city_sorce} from '@/utils/distpicker';
  40. export default {
  41. props:{
  42. provinceInfo:{
  43. type:String,
  44. default:''
  45. },
  46. cityInfo:{
  47. type:String,
  48. default:''
  49. },
  50. disabled:{
  51. type:Boolean,
  52. default:false
  53. }
  54. },
  55. data() {
  56. return {
  57. province:{
  58. provinceKey:'',
  59. provinceName:''
  60. },
  61. city:{
  62. cityKey:'',
  63. cityName:''
  64. },
  65. };
  66. },
  67. watch:{
  68. provinceInfo:{
  69. handler(newval){
  70. if(newval&&newval.length){
  71. if(newval===this.province.provinceName) return
  72. const provinceResult= Object.entries(province_sorce).find(([key,val])=>val===newval)||['',newval]
  73. this.province = {provinceKey:provinceResult[0],provinceName:provinceResult[1]}
  74. if(this.province.provinceKey){
  75. const cityResult = Object.entries(city_sorce[this.province.provinceKey]).find(([key,val])=>val===this.cityInfo)||['',this.cityInfo]
  76. this.city = {cityKey:cityResult[0],cityName:cityResult[1]}
  77. }else{
  78. this.city = {cityKey:'',cityName:this.cityInfo}
  79. }
  80. }else{
  81. this.province={provinceKey:'',provinceName:''}
  82. this.city={cityKey:'',cityName:''}
  83. }
  84. },
  85. immediate:true
  86. },
  87. },
  88. computed:{
  89. provinceSource(){
  90. return Object.keys(province_sorce).map(key=>{
  91. return {
  92. provinceKey:key||'',
  93. provinceName:province_sorce[key]||''
  94. }
  95. })
  96. },
  97. citySource(){
  98. const cityMap = city_sorce[this.province.provinceKey]||{}
  99. return Object.keys(cityMap).map(cityKey=>{
  100. return {
  101. cityKey:cityKey||'',
  102. cityName:cityMap[cityKey]||''
  103. }
  104. })
  105. }
  106. },
  107. methods: {
  108. handleSelectChange(type){
  109. if(type==='province'){
  110. this.city = {cityKey:'',cityName:''}
  111. }
  112. this.$emit('selected',{province:{value:this.province.provinceName},
  113. city:{
  114. value:this.city.cityName
  115. }})
  116. }
  117. },
  118. };
  119. </script>
  120. <style scoped lang="scss">
  121. .select-dist-picker{
  122. display: flex;
  123. gap: 10px;
  124. }
  125. </style>