index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <u-picker
  3. :show="value"
  4. ref="uPicker"
  5. class="common-pop"
  6. :columns="columnsData"
  7. keyName="name"
  8. :title="title"
  9. :defaultIndex="defaultIndex"
  10. :closeOnClickOverlay="true"
  11. @close="cancel"
  12. @confirm="confirm"
  13. @change="changeHandler"
  14. @cancel="cancel"
  15. ></u-picker>
  16. </template>
  17. <script>
  18. import { getProvinceCity } from "@/common/api/common";
  19. export default {
  20. props: {
  21. value: {
  22. type: Boolean,
  23. default: false,
  24. },
  25. defaultData: {
  26. type: Object,
  27. default: () => {
  28. return {};
  29. },
  30. },
  31. level: {
  32. type: [String, Number],
  33. default: 2,
  34. },
  35. allFlag: {
  36. type: Boolean,
  37. default: false,
  38. },
  39. title: String,
  40. default: '选择城市'
  41. },
  42. data() {
  43. return {
  44. show: true,
  45. columnsData: [[],[],[]],
  46. defaultIndex: [0, 0, 0],
  47. };
  48. },
  49. created() {
  50. this.getProvinceCity().then((data) => {
  51. // this.columnsData.push(data);
  52. this.columnsData.splice(0, 1, data)
  53. let { province = data[0].code } = this.defaultData || {};
  54. this.getProvinceCity(province).then((cityData) => {
  55. if (this.allFlag) {
  56. // 添加全部选项
  57. cityData = [{ parentCode: "", code: "all", name: "全部" }].concat(
  58. cityData
  59. );
  60. }
  61. // this.columnsData.push(cityData);
  62. // this.columnsData[1] = cityData
  63. this.columnsData.splice(1, 1, cityData)
  64. let currentP = data.findIndex((item) => item.code == province);
  65. let { city = cityData[0].code } = this.defaultData || {};
  66. let currentCity = cityData.findIndex((item) => item.code == city);
  67. if (this.level == 3) {
  68. this.getProvinceCity(city).then((regionData) => {
  69. // this.columnsData.push(regionData);
  70. // this.columnsData[2] = regionData2
  71. this.columnsData.splice(2, 1, regionData)
  72. let { region = regionData[0].code } = this.defaultData || {};
  73. let currentRegion = regionData.findIndex(
  74. (item) => item.code == region
  75. );
  76. this.defaultIndex = [
  77. currentP !== -1 ? currentP : 0,
  78. currentCity !== -1 ? currentCity : 0,
  79. currentRegion !== -1 ? currentRegion : 0,
  80. ];
  81. });
  82. } else {
  83. this.defaultIndex = [
  84. currentP !== -1 ? currentP : 0,
  85. currentCity !== -1 ? currentCity : 0,
  86. ];
  87. }
  88. });
  89. });
  90. },
  91. methods: {
  92. async getProvinceCity(code) {
  93. let result = await getProvinceCity(code);
  94. return new Promise((res, rej) => {
  95. res(result.data);
  96. });
  97. },
  98. async changeHandler(e) {
  99. const {
  100. columnIndex,
  101. value,
  102. values, // values为当前变化列的数组内容
  103. index,
  104. indexs,
  105. // 微信小程序无法将picker实例传出来,只能通过ref操作
  106. picker = this.$refs.uPicker,
  107. } = e;
  108. // 当第一列值发生变化时,变化第二列(后一列)对应的选项
  109. let code = value[0].code;
  110. let cityResult = await this.getProvinceCity(code);
  111. if (this.allFlag) {
  112. // 添加全部选项
  113. cityResult = [{ parentCode: "", code: "all", name: "全部" }].concat(
  114. cityResult
  115. );
  116. }
  117. picker.setColumnValues(1, cityResult);
  118. if (this.level == 3) {
  119. let cityCode = columnIndex === 0 ? cityResult[0].code : value[1].code;
  120. this.getProvinceCity(cityCode).then((city) => {
  121. picker.setColumnValues(2, city);
  122. });
  123. }
  124. },
  125. // 回调参数为包含columnIndex、value、values
  126. confirm(e) {
  127. let { value } = e;
  128. let result = {
  129. province: value[0].code,
  130. city: value[1].code,
  131. region: value[2] ? value[2].code : "",
  132. };
  133. this.$emit("confirm", {
  134. value: result,
  135. name:
  136. value[0].name + value[1].name + `${value[2] ? value[2].name : ""}`,
  137. });
  138. this.$emit("input", false);
  139. },
  140. cancel() {
  141. this.$emit("cancel");
  142. },
  143. },
  144. };
  145. </script>
  146. <style lang="scss" scoped>
  147. </style>