gui-area-picker.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <gui-popup
  3. ref="guipopupforareapicker"
  4. :isSwitchPage="true"
  5. :zIndex="zIndex"
  6. position="bottom">
  7. <view
  8. class="gui-ap-body gui-bg-white gui-dark-bg-level-3"
  9. @tap.stop.prevent="stopfun">
  10. <view
  11. class="gui-ap-header gui-flex gui-row gui-space-between">
  12. <text
  13. class="gui-ap-header-btn gui-block"
  14. :class="cancelClass"
  15. @tap="close">{{cancelText}}</text>
  16. <text
  17. class="gui-ap-header-btn gui-block"
  18. :class="confirmClass"
  19. style="text-align:right;"
  20. @tap="confirm">{{confirmText}}</text>
  21. </view>
  22. <picker-view
  23. :style="{height:height+'rpx'}"
  24. :indicator-style="indicatorStyle"
  25. :value="defaultVal"
  26. @change="change">
  27. <picker-view-column
  28. v-if="level >= 1">
  29. <view
  30. class="gui-picker-item"
  31. :style="indicatorStyle"
  32. v-for="(item, index) in province"
  33. :key="index">
  34. <text
  35. :style="indicatorStyle"
  36. class="gui-block gui-picker-item">{{item.label}}</text>
  37. </view>
  38. </picker-view-column>
  39. <picker-view-column
  40. v-if="level >= 2">
  41. <view
  42. class="gui-picker-item"
  43. :style="indicatorStyle"
  44. v-for="(item, index) in city[defaultVal[0]]"
  45. :key="index">
  46. <text
  47. :style="indicatorStyle"
  48. class="gui-block gui-picker-item">{{item.label}}</text>
  49. </view>
  50. </picker-view-column>
  51. <picker-view-column
  52. v-if="level >= 3">
  53. <view
  54. class="gui-picker-item"
  55. :style="indicatorStyle"
  56. v-for="(item, index) in area[defaultVal[0]][defaultVal[1]]"
  57. :key="index">
  58. <text
  59. :style="indicatorStyle"
  60. class="gui-block gui-picker-item">{{item.label}}</text>
  61. </view>
  62. </picker-view-column>
  63. </picker-view>
  64. </view>
  65. </gui-popup>
  66. </template>
  67. <script>
  68. import provinceData from '../data/city-data/province.js';
  69. import cityData from '../data/city-data/city.js';
  70. import areaData from '../data/city-data/area.js';
  71. export default{
  72. name : "gui-area-picker",
  73. props : {
  74. indicatorStyle : { type : String, default : 'height:36px; line-height:36px;'},
  75. cancelText : { type : String, default : '取消' },
  76. cancelClass : { type : Array, default : function(){return ['gui-color-gray'];}},
  77. confirmText : { type : String, default : '确定' },
  78. confirmClass : { type : Array, default : function(){return ['gui-primary-color'];}},
  79. value : { type : Array , default : function(){ return ['', '', ''] }},
  80. level : { type : Number, default : 3},
  81. height : { type : Number, default : 550 },
  82. zIndex : { type : Number, default : 1000 }
  83. },
  84. data() {
  85. return {
  86. province : provinceData,
  87. city : cityData,
  88. area : areaData,
  89. defaultVal : [0,0,0],
  90. realshow : false
  91. }
  92. },
  93. watch:{
  94. value : function(nv, ov){this.setDefault();},
  95. defaultVal : function(nv, ov){
  96. if(ov[0] != nv[0]){
  97. this.defaultVal.splice(1,1,0);
  98. this.defaultVal.splice(2,1,0);
  99. }else if(ov[1] != nv[1]){
  100. this.defaultVal.splice(2,1,0);
  101. }
  102. }
  103. },
  104. created() {
  105. this.setDefault();
  106. },
  107. methods:{
  108. setDefault:function(){
  109. if(this.value[0] == ''){return ;}
  110. this.$nextTick(() => {
  111. this.defaultVal.splice(0, 1, this.arrayIndexOf(this.province, this.value[0]));
  112. if(this.value[1] == ''){return ;}
  113. this.$nextTick(() => {
  114. this.defaultVal.splice(1,1, this.arrayIndexOf(this.city[this.defaultVal[0]], this.value[1]));
  115. if(this.value[2] == ''){return ;}
  116. this.$nextTick(() => {
  117. this.defaultVal.splice(2,1, this.arrayIndexOf(this.area[this.defaultVal[0]][this.defaultVal[1]], this.value[2]));
  118. })
  119. })
  120. });
  121. },
  122. arrayIndexOf : function(arr, needFind){
  123. var index = 0;
  124. for(let i = 0; i < arr.length; i++){if(arr[i].label == needFind){index = i; return i;}}
  125. return index;
  126. },
  127. change : function (e) {
  128. var res = e.detail.value;
  129. if(!res[0]){res[0] = 0;}
  130. if(!res[1]){res[1] = 0;}
  131. if(!res[2]){res[2] = 0;}
  132. this.defaultVal = res;
  133. },
  134. confirm:function () {
  135. var codes = [
  136. provinceData[this.defaultVal[0]].value,
  137. cityData[this.defaultVal[0]][this.defaultVal[1]].value,
  138. areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].value ? areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].value : 0
  139. ];
  140. var names = [
  141. provinceData[this.defaultVal[0]].label,
  142. cityData[this.defaultVal[0]][this.defaultVal[1]].label,
  143. areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].label ? areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].label : ''
  144. ];
  145. codes = codes.splice(0, this.level);
  146. names = names.splice(0, this.level);
  147. var res = {codes : codes, names : names, indexs : this.defaultVal};
  148. this.$emit('confirm', res);
  149. this.$refs.guipopupforareapicker.close();
  150. },
  151. open : function () {
  152. this.$refs.guipopupforareapicker.open();
  153. },
  154. close : function () {
  155. this.$refs.guipopupforareapicker.close();
  156. },
  157. stopfun : function(e){e.stopPropagation(); return null;}
  158. },
  159. emits : ['confirm']
  160. }
  161. </script>
  162. <style scoped>
  163. </style>