selectMorePickers.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <template>
  2. <view class="sel-box" style="width: 100%;">
  3. <picker mode="multiSelector" :range="multiSelector" :range-key="rangeKey" v-model="defaultSelector"
  4. @columnchange="handleColumnChange" @change="handleChange">
  5. <!-- disable = "true" 是禁用input 防止点击弹出键盘 -->
  6. <input type="text" disabled="true" v-model="cityData" placeholder="请选择点位地区" placeholder-class="placeholder"
  7. class="input-box" />
  8. </picker>
  9. </view>
  10. </template>
  11. <script>
  12. // import {
  13. // getRegionIdByPid
  14. // } from '@/api/taskSchedule.js'
  15. export default {
  16. name: "region-picker",
  17. data() {
  18. return {
  19. multiSelector: [],
  20. rangeKey: 'name',
  21. defaultSelector: [0, 0, 0],
  22. provinceList: [],
  23. cityList: [],
  24. areaList: [],
  25. cityData: '',
  26. };
  27. },
  28. mounted() {
  29. // 初始化一
  30. this.getRegionListFirst(0, 0, true, () => {
  31. this.handleColumnChange({
  32. detail: {
  33. column: 0,
  34. // value:0
  35. value: this.defaultSelector[0] //自定义省
  36. }
  37. })
  38. })
  39. // 初始化二
  40. // this.getRegionList(0, '1',false)
  41. // 不这样做初始化的原因是 这样请求中间一列会缺失 从而导致数据混乱 上面两种方法都可以避免这种情况的出现
  42. // this.getRegionList(-1,'')
  43. // this.getRegionList(0, '1')
  44. // 再次显示组件时值不清空
  45. // this.cityData = this.$store.state.home.region
  46. },
  47. methods: {
  48. getRegionListFirst(column, id, status = true, callBack = null){
  49. this.$http.post('boman-system/chinaArea/treeSelect',{pid: id}).then(res=>{
  50. // console.log(res.data)
  51. switch (column) {
  52. case -1:
  53. this.provinceList = res.data;
  54. break;
  55. case 0:
  56. this.cityList = res.data;
  57. //当请求市级数据时 县区级数据跟着加载 达到联动效果
  58. break;
  59. case 1:
  60. this.areaList = res.data;
  61. break;
  62. default:
  63. break;
  64. }
  65. if (column < 2) {
  66. this.multiSelector.splice(column + 1, 1, res.data)
  67. }
  68. callBack && callBack()
  69. // 初始化二
  70. if (!status) {
  71. this.multiSelector.splice(1, 1, this.cityList)
  72. }
  73. })
  74. },
  75. getRegionList(column, id, status = true, callBack = null) {
  76. this.$http.post('boman-system/chinaArea/treeSelect',{pid: id}).then(res=>{
  77. // console.log(res.data)
  78. switch (column) {
  79. case -1:
  80. this.provinceList = res.data;
  81. break;
  82. case 0:
  83. this.cityList = res.data;
  84. //当请求市级数据时 县区级数据跟着加载 达到联动效果
  85. this.getRegionList(1, this.cityList[0].areaId);
  86. break;
  87. case 1:
  88. this.areaList = res.data;
  89. break;
  90. default:
  91. break;
  92. }
  93. // 当请求县区级数据不再增加列 固定三列
  94. if (column < 2) {
  95. this.multiSelector.splice(column + 1, 1, res.data)
  96. }
  97. callBack && callBack()
  98. // 初始化二
  99. if (!status) {
  100. this.multiSelector.splice(1, 1, this.cityList)
  101. }
  102. console.log(this.multiSelector,11)
  103. })
  104. // getRegionIdByPid({
  105. // pid: id
  106. // }).then(res => {
  107. // switch (column) {
  108. // case -1:
  109. // this.provinceList = res;
  110. // break;
  111. // case 0:
  112. // this.cityList = res;
  113. // //当请求市级数据时 县区级数据跟着加载 达到联动效果
  114. // this.getRegionList(1, this.cityList[0].areaId);
  115. // break;
  116. // case 1:
  117. // this.areaList = res;
  118. // break;
  119. // default:
  120. // break;
  121. // }
  122. // // 当请求县区级数据不再增加列 固定三列
  123. // if (column < 2) {
  124. // this.multiSelector.splice(column + 1, 1, res)
  125. // }
  126. // callBack && callBack()
  127. // // 初始化二
  128. // if (!status) {
  129. // this.multiSelector.splice(1, 1, this.cityList)
  130. // }
  131. // })
  132. },
  133. handleColumnChange(event) {
  134. let item = {}
  135. switch (event.detail.column) {
  136. case 0:
  137. item = this.provinceList[event.detail.value];
  138. break;
  139. case 1:
  140. item = this.cityList[event.detail.value];
  141. break;
  142. case 2:
  143. item = this.areaList[event.detail.value];
  144. break;
  145. default:
  146. break;
  147. }
  148. // 当选择省那一列时 给市区两列重新归零
  149. if (event.detail.column == 0) {
  150. this.defaultSelector.splice(event.detail.column, 1, event.detail.value)
  151. this.defaultSelector.splice(1, 1, 0)
  152. this.defaultSelector.splice(2, 1, 0)
  153. } else {
  154. this.defaultSelector.splice(event.detail.column, 1, event.detail.value)
  155. }
  156. this.getRegionList(event.detail.column, item.areaId)
  157. },
  158. handleChange(info) {
  159. let arr = []
  160. info.detail.value.forEach((item, index) => {
  161. arr.push(this.multiSelector[index][item].regionName)
  162. if (index == 2) this.$emit('changeCity', this.multiSelector[2][item].areaId)
  163. })
  164. this.cityData = arr.join('-')
  165. this.$store.dispatch('home/setRegion', arr.join('-'))
  166. },
  167. // if (event.detail.column == 0) {
  168. // this.defaultSelector.splice(event.detail.column, 1, event.detail.value)
  169. // this.defaultSelector.splice(1, 1, 0)
  170. // this.defaultSelector.splice(2, 1, 0)
  171. // } else {
  172. // this.defaultSelector.splice(event.detail.column, 1, event.detail.value)
  173. // }
  174. }
  175. }
  176. </script>
  177. <style lang="scss" scoped>
  178. .sel-box {
  179. height: 60rpx;
  180. margin: 36rpx 0;
  181. border: 1px solid #c1c1c1;
  182. border-radius: 8rpx;
  183. text-align: center;
  184. color: #333333;
  185. font-size: 22rpx;
  186. .input-box {
  187. font-size: 22rpx;
  188. color: #333333;
  189. height: 60rpx;
  190. line-height: 60rpx;
  191. }
  192. /deep/ .placeholder {
  193. font-size: 22rpx;
  194. color: #BFBFBF;
  195. }
  196. }
  197. </style>