address.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <view>
  3. <view class="addres_select_val">
  4. <view>
  5. <view v-for="(item, index) of addressVal" :key="index" :class="{ select: addressIndex == index }"
  6. @click="selectType(index)">{{ item.name }}</view>
  7. <view :class="{ 'select main-text-color main-border-color': selectState == addressIndex }"
  8. v-show="selectState < length || (selectState >= length && selectState < 3 && !force)"
  9. @click="selectType(selectState)">
  10. 请选择
  11. </view>
  12. </view>
  13. </view>
  14. <scroll-view class="addres_box" scroll-y :scroll-top="scrollTop">
  15. <view>
  16. <view v-for="(item, index) of addressList" :key="index"
  17. :class="{ 'select main-text-color': addressVal.length > addressIndex && item.objId == addressVal[addressIndex].objId }"
  18. @click="selectClick(item)">
  19. {{ item.name }}
  20. </view>
  21. </view>
  22. </scroll-view>
  23. </view>
  24. </template>
  25. <script>
  26. export default {
  27. props: {
  28. //选中数据
  29. dataList: {
  30. type: Array,
  31. default () {
  32. return [];
  33. }
  34. },
  35. //联动长度[省,市,区]
  36. length: {
  37. type: Number,
  38. default () {
  39. return 3;
  40. }
  41. },
  42. //是否强制选择,如果length=2,force = false 选择到市的时候就可以确定了,但是还可以选择到区
  43. force: {
  44. type: Boolean,
  45. default () {
  46. return true;
  47. }
  48. }
  49. },
  50. created() {
  51. if (this.dataList instanceof Array) {
  52. this.addressVal = this.dataList;
  53. this.selectState = this.dataList.length;
  54. }
  55. },
  56. watch: {
  57. dataList(val) {
  58. this.addressVal = val;
  59. this.selectState = val.length;
  60. }
  61. },
  62. data() {
  63. return {
  64. //选出的值
  65. addressVal: [],
  66. //当前选择
  67. addressIndex: 0,
  68. //选择的值
  69. addressList: [],
  70. //请选择的显示
  71. selectState: 0,
  72. scrollTop: 0
  73. };
  74. },
  75. methods: {
  76. getRegion(pid) {
  77. //请求数据
  78. this.$http.get('api/kemean/aid/region', {
  79. pid: pid
  80. }, {
  81. load: false
  82. }).then(data => {
  83. if (data.length > 0) {
  84. this.addressList = data;
  85. // this.$refs.scroll.scrollTop = '0px';
  86. this.scrollTop = Math.random();
  87. } else {
  88. this.$emit('change', this.addressVal);
  89. }
  90. });
  91. },
  92. //切换对应的类型
  93. selectType(index) {
  94. this.addressIndex = index;
  95. var len = this.addressVal.length;
  96. if (index == 0) {
  97. this.getRegion(0);
  98. } else {
  99. this.getRegion(this.addressVal[index - 1].objId);
  100. }
  101. if (len == this.length) {
  102. this.selectState = this.length;
  103. } else if (len == this.length && index == this.length && this.force) {
  104. this.selectState = index;
  105. } else {
  106. this.selectState = index + 1;
  107. }
  108. },
  109. //选择
  110. selectClick(item) {
  111. if (this.addressIndex == 0) {
  112. this.addressVal = [];
  113. } else {
  114. this.addressVal.splice(this.addressIndex, this.addressVal.length - 1);
  115. }
  116. this.addressVal.push(item);
  117. if (this.addressVal.length < this.length || (this.addressVal.length < 3 && !this.force)) {
  118. this.getRegion(item.objId);
  119. this.addressIndex++;
  120. }
  121. if (this.addressVal.length >= this.length || !this.force) {
  122. this.$emit('change', this.addressVal);
  123. }
  124. this.selectState = this.addressVal.length;
  125. }
  126. },
  127. mounted() {
  128. this.getRegion(0);
  129. }
  130. };
  131. </script>
  132. <style scoped>
  133. .addres_select_val {
  134. padding: 0upx 10upx;
  135. border-bottom: 1upx solid #ebebeb;
  136. box-sizing: border-box;
  137. background-color: #fff;
  138. }
  139. .addres_select_val>view {
  140. display: flex;
  141. flex-wrap: wrap;
  142. }
  143. .addres_select_val>view>view {
  144. margin-left: 20upx;
  145. padding: 0upx 10upx;
  146. height: 72upx;
  147. line-height: 72upx;
  148. border-bottom: 2upx solid #fff;
  149. box-sizing: border-box;
  150. font-size: 28upx;
  151. }
  152. .addres_select_val>view>view:first-child {
  153. margin-left: 0upx;
  154. }
  155. .addres_select_val>view>view.select {
  156. border-bottom: 2upx solid;
  157. }
  158. .addres_box {
  159. padding: 0upx 20upx;
  160. height: 420upx;
  161. overflow-y: auto;
  162. background-color: #fff;
  163. }
  164. .addres_box view>view {
  165. height: 72upx;
  166. line-height: 72upx;
  167. font-size: 28upx;
  168. }
  169. </style>