gui-area-picker.vue 5.0 KB

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