address-card.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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"
  30. active-color="#38C148">默认地址</u-checkbox>
  31. </view>
  32. <view class="common-text-2" @click.stop="onDelete">删除</view>
  33. </view>
  34. </view>
  35. </template>
  36. <script>
  37. export default {
  38. name: 'address-item',
  39. props: {
  40. address: {
  41. type: Object,
  42. default: () => ({})
  43. },
  44. selected: {
  45. type: Boolean,
  46. default: false
  47. },
  48. isSelect: {
  49. type: [Boolean, Number,String],
  50. default: false
  51. },
  52. },
  53. data() {
  54. return {
  55. isDefault: false,
  56. }
  57. },
  58. watch: {
  59. address: {
  60. handler(value) {
  61. this.isDefault = value.defaultFlag == 1
  62. },
  63. deep: true,
  64. immediate: true
  65. }
  66. },
  67. methods: {
  68. handleClick() {
  69. this.$emit('tapItem', this.address)
  70. },
  71. //更新地址
  72. updateAddress() {
  73. uni.navigateTo({
  74. url: '/pages-mine/pages/address/add-or-update?id=' + this.address.id
  75. })
  76. },
  77. onDefaultChange(value) {
  78. if (this.address.defaultFlag == 1) return this.isDefault = true
  79. let id = this.address.id
  80. uni.$u.http.post(`/token/user/address/setDefault/${id}`).then(res => {
  81. if (res.code == 200) {
  82. uni.showToast({
  83. icon: "none",
  84. title: "设置默认地址成功"
  85. })
  86. this.$emit('success')
  87. } else {
  88. uni.showToast({
  89. icon: "none",
  90. title: res.msg
  91. })
  92. this.isDefault = false
  93. }
  94. })
  95. },
  96. onDelete() {
  97. this.$emit('delete', this.address.id)
  98. }
  99. }
  100. }
  101. </script>
  102. <style lang="scss" scoped>
  103. .address-card {
  104. position: relative;
  105. background-color: #FFFFFF;
  106. padding: 20rpx 30rpx;
  107. margin-bottom: 20rpx;
  108. border-radius: 12rpx;
  109. border: 2rpx solid transparent;
  110. transition: all 0.3s;
  111. margin-bottom: 20rpx;
  112. // 选中状态样式
  113. &--selected {
  114. border-color: #38C148;
  115. background-color: rgba(56, 193, 72, 0.05);
  116. }
  117. // 选中状态的勾
  118. .selected-icon {
  119. position: absolute;
  120. right: -2rpx;
  121. top: -2rpx;
  122. width: 40rpx;
  123. height: 40rpx;
  124. background-color: #38C148;
  125. display: flex;
  126. align-items: center;
  127. justify-content: center;
  128. border-bottom-left-radius: 12rpx;
  129. border-top-right-radius: 12rpx;
  130. &.no-select-icon {
  131. background-color: #d8d8d8;
  132. }
  133. }
  134. .status {
  135. font-size: 24rpx;
  136. color: #38C148;
  137. padding: 4rpx 12rpx;
  138. border: 1px solid #38C148;
  139. border-radius: 6rpx;
  140. }
  141. .footer {
  142. margin-top: 20rpx;
  143. padding-top: 20rpx;
  144. border-top: 1rpx solid #EEEEEE;
  145. }
  146. }
  147. </style>