searchDistPicker.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <!-- 可搜索的 distpicker(地区选择器) -->
  3. <div class="select-dist-picker">
  4. <!-- 省选择器 -->
  5. <el-select
  6. placeholder="请选择省"
  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="请选择市"
  23. filterable
  24. v-model="city"
  25. value-key="cityKey"
  26. :disabled="disabled"
  27. @change="handleSelectChange('city')"
  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. <!-- 区选择器 -->
  37. <el-select v-if="showArea"
  38. placeholder="请选择区"
  39. filterable
  40. v-model="area"
  41. value-key="areaKey"
  42. :disabled="disabled"
  43. @change="handleSelectChange"
  44. >
  45. <el-option
  46. v-for="area in areaSource"
  47. :key="area.areaKey"
  48. :label="area.areaName"
  49. :value="area"
  50. />
  51. </el-select>
  52. </div>
  53. </template>
  54. <script>
  55. import {province_sorce,city_sorce,area_sorce} from '@/utils/distpicker';
  56. export default {
  57. props:{
  58. provinceInfo:{
  59. type:String,
  60. default:''
  61. },
  62. cityInfo:{
  63. type:String,
  64. default:''
  65. },
  66. disabled:{
  67. type:Boolean,
  68. default:false
  69. },
  70. showArea:{
  71. type:Boolean,
  72. default:false
  73. },
  74. areaInfo:{
  75. type:String,
  76. default:''
  77. }
  78. },
  79. data() {
  80. return {
  81. province:{
  82. provinceKey:'',
  83. provinceName:''
  84. },
  85. city:{
  86. cityKey:'',
  87. cityName:''
  88. },
  89. area:{
  90. areaKey:'',
  91. areaName:''
  92. }
  93. };
  94. },
  95. watch:{
  96. provinceInfo:{
  97. handler(newval){
  98. if(newval&&newval.length){
  99. if(newval===this.province.provinceName) return
  100. const provinceResult= Object.entries(province_sorce).find(([key,val])=>val===newval)||['',newval]
  101. this.province = {provinceKey:provinceResult[0],provinceName:provinceResult[1]}
  102. if(this.province.provinceKey){
  103. const cityResult = Object.entries(city_sorce[this.province.provinceKey]).find(([key,val])=>val===this.cityInfo)||['',this.cityInfo]
  104. this.city = {cityKey:cityResult[0],cityName:cityResult[1]}
  105. }else{
  106. this.city = {cityKey:'',cityName:this.cityInfo}
  107. }
  108. if(this.city.cityKey && this.showArea){
  109. const areaResult = Object.entries(area_sorce[this.city.cityKey]).find(([key,val])=>val===this.areaInfo)||['',this.areaInfo]
  110. this.area={areaKey:areaResult[0],areaName:areaResult[1]}
  111. }else{
  112. this.area={areaKey:'',areaName:this.areaInfo}
  113. }
  114. }else{
  115. this.province={provinceKey:'',provinceName:''}
  116. this.city={cityKey:'',cityName:''}
  117. this.area={areaKey:'',areaName:''}
  118. }
  119. },
  120. immediate:true
  121. },
  122. },
  123. computed:{
  124. provinceSource(){
  125. return Object.keys(province_sorce).map(key=>{
  126. return {
  127. provinceKey:key||'',
  128. provinceName:province_sorce[key]||''
  129. }
  130. })
  131. },
  132. citySource(){
  133. const cityMap = city_sorce[this.province.provinceKey]||{}
  134. return Object.keys(cityMap).map(cityKey=>{
  135. return {
  136. cityKey:cityKey||'',
  137. cityName:cityMap[cityKey]||''
  138. }
  139. })
  140. },
  141. areaSource(){
  142. const areaMap = area_sorce[this.city.cityKey]||{}
  143. return Object.keys(areaMap).map(areaKey=>{
  144. return {
  145. areaKey:areaKey||'',
  146. areaName:areaMap[areaKey]||''
  147. }
  148. })
  149. }
  150. },
  151. methods: {
  152. handleSelectChange(type){
  153. if(type==='province'){
  154. this.city = {cityKey:'',cityName:''}
  155. this.area = {areaKey:'',areaName:''}
  156. }
  157. if(type==='city'&&this.showArea){
  158. this.area = {areaKey:'',areaName:''}
  159. }
  160. this.$emit('selected',{
  161. province:{value:this.province.provinceName},
  162. city:{value:this.city.cityName},
  163. area:{value:this.area.areaName}
  164. })
  165. }
  166. },
  167. };
  168. </script>
  169. <style scoped lang="scss">
  170. .select-dist-picker{
  171. display: flex;
  172. gap: 10px;
  173. }
  174. </style>