QS-picker-city.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <QSPickerTemplate ref="QSPickerTem" :height="height" :lineHeight="lineHeight" :fontScale="fontScale"
  3. :buttonSet="buttonSet" :title="title" :mode="mode" :zIndex="zIndex" :bgColor_title="bgColor_title"
  4. :autoHide="autoHide" :titleColor="titleColor" @confirm="confirm">
  5. <picker-view
  6. @touchmove.prevent.stop="voidFc()"
  7. indicator-style="height: 60px;"
  8. :value="value"
  9. @change="bindChange($event)">
  10. <picker-view-column>
  11. <view class="flex_row_c_c pickerDefault" :class="((value[0] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in provinceDataList" :key="picker_index">{{picker_item.label}}</view>
  12. </picker-view-column>
  13. <picker-view-column>
  14. <view class="flex_row_c_c pickerDefault" :class="((value[1] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in cityDataList" :key="picker_index">{{picker_item.label}}</view>
  15. </picker-view-column>
  16. <picker-view-column>
  17. <view class="flex_row_c_c pickerDefault" :class="((value[2] || 0) === picker_index?'selectColor':'defaultColor')" v-for="(picker_item,picker_index) in areaDataList" :key="picker_index">{{picker_item.label}}</view>
  18. </picker-view-column>
  19. </picker-view>
  20. </QSPickerTemplate>
  21. </template>
  22. <script>
  23. import QSPickerTemplate from './QS-pickerTemplate.vue';
  24. import QSPickerMixin from '../js/QS-picker-mixin.js';
  25. var provinceData = {};
  26. var cityData = {};
  27. var areaData = {};
  28. export default {
  29. name: 'QS-picker-city',
  30. mixins: [QSPickerMixin()],
  31. components: {
  32. QSPickerTemplate
  33. },
  34. data() {
  35. return {
  36. provinceDataList: [],
  37. cityDataList: [],
  38. areaDataList: [],
  39. };
  40. },
  41. methods: {
  42. init() {
  43. let value = [];
  44. value = this.dataSet.defaultValue || [0, 0, 0];
  45. provinceData = require('../city-data/province.js').default;
  46. cityData = require('../city-data/city.js').default;
  47. areaData = require('../city-data/area.js').default;
  48. //city、provincialStreet
  49. this.provinceDataList = provinceData;
  50. this.cityDataList = cityData[value[0]];
  51. this.areaDataList = areaData[value[0]][value[1]];
  52. this.value = value;
  53. this.defaultValue = [...value];
  54. },
  55. bindChange({
  56. detail: {
  57. value
  58. }
  59. }) {
  60. if (this.value[0] !== value[0]) {
  61. // 第一级发生滚动
  62. this.cityDataList = cityData[value[0]];
  63. this.areaDataList = areaData[value[0]][0];
  64. value[1] = 0;
  65. value[2] = 0;
  66. } else if (this.value[1] !== value[1]) {
  67. // 第二级滚动
  68. this.areaDataList = areaData[value[0]][value[1]];
  69. value[2] = 0;
  70. }
  71. this.value = value;
  72. this.$emit('pickerChange', {value});
  73. },
  74. confirm() {
  75. const obj = {
  76. data: this._getLabel(),
  77. value: this.value,
  78. cityCode: this._getCityCode()
  79. };
  80. this.$emit('confirm', obj);
  81. if (this.autoHide) this.hide();
  82. },
  83. _getLabel() {
  84. let pcikerLabel =
  85. this.provinceDataList[this.value[0]].label +
  86. '-' +
  87. this.cityDataList[this.value[1]].label +
  88. '-' +
  89. this.areaDataList[this.value[2]].label;
  90. return pcikerLabel;
  91. },
  92. _getCityCode() {
  93. return this.areaDataList[this.value[2]].value;
  94. }
  95. }
  96. }
  97. </script>
  98. <style scoped>
  99. @import url("../css/QS-picker.css");
  100. @import url("../../../config/css/picker.css");
  101. </style>