slambb-picker-city.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <view class="city-container ">
  3. <view class="city-view">
  4. <picker-view class="city-picker-view" v-if="visible" :indicator-style="indicatorStyle" :value="value" @change="bindChange">
  5. <picker-view-column>
  6. <view class="city-item" v-for="(picker_item,picker_index) in provinceDataList" :key="picker_index">{{picker_item.label}}</view>
  7. </picker-view-column>
  8. <picker-view-column>
  9. <view class="city-item" v-for="(picker_item,picker_index) in cityDataList" :key="picker_index">{{picker_item.label}}</view>
  10. </picker-view-column>
  11. <picker-view-column>
  12. <view class="city-item" v-for="(picker_item,picker_index) in areaDataList" :key="picker_index">{{picker_item.label}}</view>
  13. </picker-view-column>
  14. </picker-view>
  15. </view>
  16. </view>
  17. </template>
  18. -
  19. <script>
  20. var minDate = 1950;
  21. var provinceData = {};
  22. var cityData = {};
  23. var areaData = {};
  24. export default {
  25. props: {
  26. itemObj: { //各类型携带的数据
  27. type: Object,
  28. default () {
  29. return {};
  30. }
  31. }
  32. },
  33. data() {
  34. return {
  35. provinceDataList: [],
  36. cityDataList: [],
  37. areaDataList: [],
  38. // 年月日
  39. value: [],
  40. visible: true,
  41. indicatorStyle: `height: 65rpx; `,
  42. }
  43. },
  44. //组件生命周期
  45. // created: function(e) {
  46. // console.log("created itemObj=", this.bInit);
  47. // },
  48. // destroyed:function(e){
  49. // console.log("destroyed itemObj=", this.bInit);
  50. // },
  51. mounted() {
  52. let value = [];
  53. let provinceDataList;
  54. let cityDataList;
  55. let areaDataList;
  56. provinceData = require('./city-data/province.js').default;
  57. cityData = require('./city-data/city.js').default;
  58. areaData = require('./city-data/area.js').default;
  59. value = this.itemObj.defaultValue || [0, 0, 0];
  60. // 解析citycode
  61. // for (let i = 0; i < provinceData.length; i++) {
  62. // if (provinceData[i].value == this.itemObj.defaultValue.substr(0, 2)) {
  63. // let currentCityData = cityData[i];
  64. // for (let j = 0; j < currentCityData.length; j++) {
  65. // if (currentCityData[j].value == this.itemObj.defaultValue.substr(0, 4)) {
  66. // let areaDataTemp = areaData[i][j];
  67. // for (let k = 0; k < areaDataTemp.length; k++) {
  68. // if (areaDataTemp[k].value == this.itemObj.defaultValue) {
  69. // value = [i, j, k];
  70. // break;
  71. // }
  72. // }
  73. // break;
  74. // }
  75. // }
  76. // break;
  77. // }
  78. // }
  79. provinceDataList = provinceData;
  80. cityDataList = cityData[value[0]];
  81. areaDataList = areaData[value[0]][value[1]];
  82. //city、provincialStreet
  83. this.provinceDataList = provinceDataList;
  84. this.cityDataList = cityDataList;
  85. this.areaDataList = areaDataList;
  86. this.value = value;
  87. // console.log('显示时候更新一次数据');
  88. this.$emit('bindChangeCity', {
  89. label: this._getLabel(),
  90. value: this.value,
  91. cityCode: this._getCityCode()
  92. });
  93. },
  94. methods: {
  95. _getLabel() {
  96. let pcikerLabel =
  97. this.provinceDataList[this.value[0]].label +
  98. '-' +
  99. this.cityDataList[this.value[1]].label +
  100. '-' +
  101. this.areaDataList[this.value[2]].label;
  102. return pcikerLabel;
  103. },
  104. _getCityCode() {
  105. return this.areaDataList[this.value[2]].value;
  106. },
  107. bindChange({
  108. detail: {
  109. value
  110. }
  111. }) {
  112. // console.log(JSON.stringify(e))
  113. let changevalue;
  114. changevalue = value;
  115. if (this.value[0] !== changevalue[0]) {
  116. // 第一级发生滚动
  117. this.cityDataList = cityData[changevalue[0]];
  118. this.areaDataList = areaData[changevalue[0]][0];
  119. changevalue[1] = 0;
  120. changevalue[2] = 0;
  121. } else if (this.value[1] !== changevalue[1]) {
  122. // 第二级滚动
  123. this.areaDataList = areaData[changevalue[0]][changevalue[1]];
  124. changevalue[2] = 0;
  125. }
  126. this.value = changevalue;
  127. this.$emit('bindChangeCity', {
  128. label: this._getLabel(),
  129. value: this.value,
  130. cityCode: this._getCityCode()
  131. });
  132. }
  133. }
  134. }
  135. </script>
  136. <style>
  137. /* picker */
  138. .city-container {
  139. position: relative;
  140. display: flex;
  141. justify-content: center;
  142. }
  143. .city-view {
  144. background: #FFFFFF;
  145. width: 100%;
  146. height: 300rpx;
  147. display: flex;
  148. justify-content: center;
  149. border-radius: 20upx;
  150. }
  151. .city-picker-view {
  152. width: 100%;
  153. height: 300rpx;
  154. border-radius: 20px;
  155. }
  156. .city-item {
  157. text-align: center;
  158. width: calc(100% - 0px);
  159. height: 65rpx;
  160. line-height: 65rpx;
  161. text-overflow: ellipsis;
  162. white-space: nowrap;
  163. font-size: 20px;
  164. color: rgba(164, 136, 220, 1);
  165. }
  166. </style>