Address.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <view class="address-main">
  3. <pickerAddress @change="(info) => addressChange(info, item)"
  4. :selectValue="[formData.provinceInd, formData.cityInd, formData.districtInd]"
  5. style="width: 100%;"
  6. >
  7. <view
  8. class="inp"
  9. :class="formData.provinceName && formData.cityName && formData.districtName ? 'form-input' : 'form-placeholder'">
  10. {{ addressValue }}
  11. </view>
  12. </pickerAddress>
  13. <view class="icon-address" @click="onCityWx"></view>
  14. </view>
  15. </template>
  16. <script setup>
  17. import { reactive, ref,inject } from "vue";
  18. import { splitAddress, getCityCode, getAdressCode } from '@/utils/adress'
  19. import { regionAddresstree } from '@/api/home.js'
  20. import pickerAddress from '../../components/pickerAddress/pickerAddress.vue'
  21. import { computed } from "vue";
  22. const formData = inject('formData');
  23. const props = defineProps({
  24. column: {
  25. type: Array,
  26. default: [],
  27. },
  28. isCode: {
  29. type: Boolean,
  30. default: true
  31. }
  32. });
  33. // const formData = reactive({
  34. // sex: null,
  35. // city: null,
  36. // provinceName: '', // 省
  37. // provinceCode: '',
  38. // provinceInd: 21,
  39. // cityName: '', // 市
  40. // cityCode: '',
  41. // cityInd: 0,
  42. // districtName: '',
  43. // districtCode: '',
  44. // districtInd: 17,
  45. // });
  46. const addressValue = computed(() => {
  47. if (formData.provinceName && formData.cityName && formData.districtName) {
  48. return [formData.provinceName, formData.cityName, formData.districtName].join('/');
  49. }
  50. return '请填写所在区域'
  51. })
  52. function addressChange(info) {
  53. console.log(info, '>>>>data');
  54. if (!info || !info.data) {
  55. console.error('Invalid address change info:', info);
  56. return;
  57. }
  58. if (!Array.isArray(info.data) || info.data.length < 3) {
  59. console.error('Invalid address data:', info.data);
  60. return;
  61. }
  62. const code = Array.isArray(info.code) ? info.code : ['', '', ''];
  63. let indexArray;
  64. if (Array.isArray(info.index)) {
  65. indexArray = info.index;
  66. } else if (info.index && typeof info.index[Symbol.iterator] === 'function') {
  67. indexArray = Array.from(info.index);
  68. } else {
  69. indexArray = [0, 0, 0];
  70. }
  71. Object.assign(formData, {
  72. provinceName: info.data[0],
  73. provinceCode: info.code[0],
  74. provinceInd: indexArray[0] || 0,
  75. cityName: info.data[1],
  76. cityCode: info.code[1],
  77. cityInd: indexArray[1] || 0,
  78. districtName: info.data[2],
  79. districtCode: info.code[2],
  80. districtInd: indexArray[2] || 0
  81. })
  82. console.log('formData===>', formData);
  83. }
  84. function onCityWx() {
  85. console.log('地区选点');
  86. wx.chooseLocation({
  87. success: async function (res) {
  88. console.log('res.address', res);
  89. const result = splitAddress(res.address);
  90. const res_dara = await regionAddresstree();
  91. const handlecityData = getCityCode([result.province, result.city, result.district].join(' '), res_dara.data)
  92. const api_res = await getAdressCode({ latitude: res.latitude, longitude: res.longitude }, res_dara.data)
  93. console.log("=================>", handlecityData, api_res)
  94. addressChange(api_res.cityCode)
  95. Object.assign(formData, {
  96. address: result.detail
  97. })
  98. },
  99. fail: function (err) {
  100. console.log(err);
  101. uni.showToast({
  102. title: '获取地址失败',
  103. icon: 'error',
  104. });
  105. },
  106. })
  107. }
  108. </script>
  109. <style lang="scss" scoped>
  110. .address-main{
  111. display: flex;
  112. align-items: center;
  113. justify-content: space-between;
  114. width: 100%;
  115. .inp {
  116. flex: 1;
  117. }
  118. }
  119. .form-input {
  120. flex: 1;
  121. font-family: PingFang SC;
  122. font-size: 32rpx;
  123. line-height: 44rpx;
  124. color: #130F26;
  125. }
  126. .form-placeholder {
  127. color: #C9CDD4;
  128. }
  129. .icon-address {
  130. width: 36rpx;
  131. height: 36rpx;
  132. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAMBSURBVFiF7ZcxaBNRGMd/33k1FURQHDpUUKRYoUMHhYIK6eBSCpqWomMdrUmtFBFBMIOCQ4ulqXVwcXEQsdUqLg5mcCjo0EFowYJCHTKIBXVI7OU+h6QQc+/ukrs4CP63d9/3/t8v79597wX+6x+TRJmkE0MncHUQ1T6QboSOSoAC6Boiy6g8l9zC8l8F0vHUGSAL9DY4ZQXIyuzi85YC6dhAB3biATDYqHGdXtLmXJDpF19jA2l6uBvLfQ10RoTZ1hdc67TMPV2LDFSFeQPVPRJfBZzyKZlfWvdLsHxhRpPtWO6TFsIAdGDveKKjyfamgdiz9ybQ00KYbfVWvY0yvrLqJt4A7BDzIpAHPlTHPUAS8F2BSgGKlEuHZP5VoT5kLmgnJkNhVB9T/jVRb6pjAx3s2DmDyDnfuUI7duIycN0bMtUaT20Q/FXdk9nFdCDveGoOuBSQ8kVmFw+EAlW/rNUAoxX2bR6XbN4B0MxQJxaV1dgqPtpeMc0mbb7tfUdQE3Wto/VtwLupRYM3suh0DUwfoquoTqE6hZ34qJmhPgDJ5h1Ep0O8PLVMQEeCTXhbk3sf2F0T3Q1uzphrlB4OB0LbAnlmnn2uGXpfh8gxn1yDme5qAEiKQR46cfZgzXDFUOS9T66JyFPLC6Ti29YBcDhZk3sR+FkT/YlrZYy5JhlqmYA+eJ79MUMmNZu0ASS3sIxT6gKuAldxSl3bdyDNJm0smQwB8tSK1odU5iS3kPGNA5oZyiEa1KuMfcjcjVUfIwG/TjSt46n9OKUrxk5tJ+6Cng8CRnhkfmziqZh+opEzSerOMiWJhMyDIo75LPO9D2kmdQfhWohxVN2W2cUbpoD/9ePHZhYxfNZxJazwffOWX9gXSB7mi2yVRwDPssZQga3yiDzM+/Y6/xUCZH5pHdfqbxFUAdfqD7q+QqP/OuLfrSswIRf8hoFiQjUM0xRQRKimYJoGahKqaZhIQA1CRYKJDBQCFRkmFpAPVCyY2EB1UMSFaZk0Pdyt6eHuVnj9BiyJPmU/kRUQAAAAAElFTkSuQmCC);
  133. background-position: center;
  134. background-size: 36rpx auto;
  135. background-repeat: no-repeat;
  136. // margin-right: 32rpx;
  137. }
  138. </style>