address-card.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <view class="address-card" :class="{ 'address-card--selected': selected }">
  3. <!-- 选中状态的勾 -->
  4. <view class="selected-icon no-select-icon" v-if="isSelect == 1" @tap="handleClick">
  5. <u-icon name="checkmark" color="#FFFFFF" size="24"></u-icon>
  6. </view>
  7. <view class="selected-icon" v-if="selected" @tap="handleClick">
  8. <u-icon name="checkmark" color="#FFFFFF" size="24"></u-icon>
  9. </view>
  10. <!-- 主要内容区 -->
  11. <view class="content flex-a" @click="updateAddress">
  12. <image src="../static/adderss.png" style="width: 40rpx; height: 40rpx"></image>
  13. <view class="flex-1 mr-40 ml-24 flex-d">
  14. <view class="header flex-a flex-1 mb-24">
  15. <view class="name-phone">
  16. <text class="common-text-2">{{ address.name }}</text>
  17. <text class="common-text-2 ml-20">{{ address.mobile }}</text>
  18. </view>
  19. <view class="status ml-40" v-if="address.defaultFlag == 1">默认</view>
  20. </view>
  21. <view class="common-text-2">{{ address.fullAddress }}</view>
  22. </view>
  23. <!-- 右侧箭头 -->
  24. <u-icon name="arrow-right" size="32" color="#999"></u-icon>
  25. </view>
  26. <!-- 底部操作区 -->
  27. <view class="footer flex-a flex-j-b">
  28. <view class="common-text-2">
  29. <u-checkbox v-model="isDefault" @change="onDefaultChange" shape="circle" active-color="#38C148"
  30. >默认地址</u-checkbox
  31. >
  32. </view>
  33. <view class="common-text-2" @click.stop="onDelete">删除</view>
  34. </view>
  35. </view>
  36. </template>
  37. <script>
  38. export default {
  39. name: "address-item",
  40. props: {
  41. address: {
  42. type: Object,
  43. default: () => ({}),
  44. },
  45. selected: {
  46. type: Boolean,
  47. default: false,
  48. },
  49. isSelect: {
  50. type: [Boolean, Number, String],
  51. default: false,
  52. },
  53. },
  54. data() {
  55. return {
  56. isDefault: false,
  57. };
  58. },
  59. watch: {
  60. address: {
  61. handler(value) {
  62. this.isDefault = value.defaultFlag == 1;
  63. },
  64. deep: true,
  65. immediate: true,
  66. },
  67. },
  68. methods: {
  69. handleClick() {
  70. this.$emit("tapItem", this.address);
  71. },
  72. //更新地址
  73. updateAddress() {
  74. uni.navigateTo({
  75. url: "/pages-mine/pages/address/add-or-update?id=" + this.address.id,
  76. });
  77. return
  78. if (!this.isSelect) {
  79. uni.navigateTo({
  80. url: "/pages-mine/pages/address/add-or-update?id=" + this.address.id,
  81. });
  82. } else {
  83. this.$emit("tapItem", this.address);
  84. }
  85. },
  86. onDefaultChange(value) {
  87. if (this.address.defaultFlag == 1) return (this.isDefault = true);
  88. let id = this.address.id;
  89. uni.$u.http.post(`/token/user/address/setDefault/${id}`).then((res) => {
  90. if (res.code == 200) {
  91. uni.showToast({
  92. icon: "none",
  93. title: "设置默认地址成功",
  94. });
  95. this.$emit("success");
  96. } else {
  97. uni.showToast({
  98. icon: "none",
  99. title: res.msg,
  100. });
  101. this.isDefault = false;
  102. }
  103. });
  104. },
  105. onDelete() {
  106. this.$emit("delete", this.address.id);
  107. },
  108. },
  109. };
  110. </script>
  111. <style lang="scss" scoped>
  112. .address-card {
  113. position: relative;
  114. background-color: #ffffff;
  115. padding: 20rpx 30rpx;
  116. margin-bottom: 20rpx;
  117. border-radius: 12rpx;
  118. border: 2rpx solid transparent;
  119. transition: all 0.3s;
  120. margin-bottom: 20rpx;
  121. // 选中状态样式
  122. &--selected {
  123. border-color: #38c148;
  124. background-color: rgba(56, 193, 72, 0.05);
  125. }
  126. // 选中状态的勾
  127. .selected-icon {
  128. position: absolute;
  129. right: -2rpx;
  130. top: -2rpx;
  131. width: 40rpx;
  132. height: 40rpx;
  133. background-color: #38c148;
  134. display: flex;
  135. align-items: center;
  136. justify-content: center;
  137. border-bottom-left-radius: 12rpx;
  138. border-top-right-radius: 12rpx;
  139. &.no-select-icon {
  140. background-color: #d8d8d8;
  141. }
  142. }
  143. .status {
  144. font-size: 24rpx;
  145. color: #38c148;
  146. padding: 4rpx 12rpx;
  147. border: 1px solid #38c148;
  148. border-radius: 6rpx;
  149. }
  150. .footer {
  151. margin-top: 20rpx;
  152. padding-top: 20rpx;
  153. border-top: 1rpx solid #eeeeee;
  154. }
  155. }
  156. </style>