| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 | <!-- 下单界面,收货地址 or 自提门店的选择组件 --><template>  <view class="allAddress" :style="state.isPickUp ? '':'padding-top:10rpx;'">    <view class="nav flex flex-wrap">      <view class="item font-color" :class="state.deliveryType === 1 ? 'on' : 'on2'"            @tap="switchDeliveryType(1)" v-if='state.isPickUp' />      <view class="item font-color" :class="state.deliveryType === 2 ? 'on' : 'on2'"            @tap="switchDeliveryType(2)" v-if='state.isPickUp' />    </view>    <!-- 情况一:收货地址的选择 -->    <view class='address flex flex-wrap flex-center ss-row-between' @tap='onSelectAddress' v-if='state.deliveryType === 1'          :style="state.isPickUp ? '':'border-top-left-radius: 14rpx;border-top-right-radius: 14rpx;'">      <view class='addressCon' v-if="state.addressInfo.name">        <view class='name'>{{ state.addressInfo.name }}          <text class='phone'>{{ state.addressInfo.mobile }}</text>        </view>        <view class="flex flex-wrap">          <text class='default font-color' v-if="state.addressInfo.defaultStatus">[默认]</text>          <text class="line2">{{ state.addressInfo.areaName }} {{ state.addressInfo.detailAddress }}</text>        </view>      </view>      <view class='addressCon' v-else>        <view class='setaddress'>设置收货地址</view>      </view>      <view class='iconfont'>        <view class="ss-rest-button">          <text class="_icon-forward" />        </view>      </view>    </view>    <!-- 情况二:门店的选择 -->    <view class='address flex flex-wrap flex-center ss-row-between' v-else @tap="onSelectAddress">        <view class='addressCon' v-if="state.pickUpInfo.name">          <view class='name'>{{ state.pickUpInfo.name }}            <text class='phone'>{{ state.pickUpInfo.phone }}</text>          </view>          <view class="line1"> {{ state.pickUpInfo.areaName }}{{ ', ' + state.pickUpInfo.detailAddress }}          </view>        </view>        <view class='addressCon' v-else>          <view class='setaddress'>选择自提门店</view>        </view>        <view class='iconfont'>          <view class="ss-rest-button">            <text class="_icon-forward" />          </view>        </view>    </view>    <view class='line'>      <image :src="sheep.$url.static('/static/images/line.png', 'local')" />    </view>  </view></template><script setup>  import { computed } from 'vue';  import sheep from '@/sheep';  import { isEmpty } from 'lodash-es';  const props = defineProps({    modelValue: {      type: Object,      default() {},    }  });  const emits = defineEmits(['update:modelValue']);  // computed 解决父子组件双向数据同步  const state = computed({    get(){      return new Proxy(props.modelValue, {        set(obj, name, val) {          emits('update:modelValue', {            ...obj,            [name]: val,          });          return true;        }      })    },    set(val){      emits('update:modelValue', val);    }  })  // 选择地址  function onSelectAddress() {    let emitName = 'SELECT_ADDRESS'    let addressPage = '/pages/user/address/list?type=select';    if (state.value.deliveryType === 2){      emitName = 'SELECT_PICK_UP_INFO'      addressPage = '/pages/user/goods_details_store/index'    }    uni.$once(emitName, (e) => {      changeConsignee(e.addressInfo);    });    sheep.$router.go(addressPage);  }  // 更改收货人地址&计算订单信息  async function changeConsignee(addressInfo = {}) {    if (!isEmpty(addressInfo)) {      if (state.value.deliveryType === 1){        state.value.addressInfo = addressInfo;      }      if (state.value.deliveryType === 2){        state.value.pickUpInfo = addressInfo;      }    }  }  // 收货方式切换  const switchDeliveryType = (type) =>{    state.value.deliveryType = type;  }</script><style scoped lang="scss">  .allAddress .font-color{    color: #E93323!important  }  .line2{    width: 504rpx;  }  .textR {    text-align: right;  }  .line {    width: 100%;    height: 3rpx;  }  .line image {    width: 100%;    height: 100%;    display: block;  }  .address {    padding: 28rpx;    background-color: #fff;    box-sizing: border-box;  }  .address .addressCon {    width: 596rpx;    font-size: 26rpx;    color: #666;  }  .address .addressCon .name {    font-size: 30rpx;    color: #282828;    font-weight: bold;    margin-bottom: 10rpx;  }  .address .addressCon .name .phone {    margin-left: 50rpx;  }  .address .addressCon .default {    margin-right: 12rpx;  }  .address .addressCon .setaddress {    color: #333;    font-size: 28rpx;  }  .address .iconfont {    font-size: 35rpx;    color: #707070;  }  .allAddress {    width: 100%;    background: linear-gradient(to bottom, #e93323 0%, #f5f5f5 100%);    // background-image: linear-gradient(to bottom, #e93323 0%, #f5f5f5 100%);    // background-image: -webkit-linear-gradient(to bottom, #e93323 0%, #f5f5f5 100%);    // background-image: -moz-linear-gradient(to bottom, #e93323 0%, #f5f5f5 100%);    //padding: 100rpx 30rpx 0 30rpx;    padding-top: 100rpx;    padding-bottom: 10rpx;  }  .allAddress .nav {    width: 690rpx;    margin: 0 auto;  }  .allAddress .nav .item {    width: 334rpx;  }  .allAddress .nav .item.on {    position: relative;    width: 230rpx;  }  .allAddress .nav .item.on::before {    position: absolute;    bottom: 0;    content: "快递配送";    font-size: 28rpx;    display: block;    height: 0;    width: 336rpx;    border-width: 0 20rpx 80rpx 0;    border-style: none solid solid;    border-color: transparent transparent #fff;    z-index: 2;    border-radius: 14rpx 36rpx 0 0;    text-align: center;    line-height: 80rpx;  }  .allAddress .nav .item:nth-of-type(2).on::before {    content: "到店自提";    border-width: 0 0 80rpx 20rpx;    border-radius: 36rpx 14rpx 0 0;  }  .allAddress .nav .item.on2 {    position: relative;  }  .allAddress .nav .item.on2::before {    position: absolute;    bottom: 0;    content: "到店自提";    font-size: 28rpx;    display: block;    height: 0;    width: 401rpx;    border-width: 0 0 60rpx 60rpx;    border-style: none solid solid;    border-color: transparent transparent #f7c1bd;    border-radius: 36rpx 14rpx 0 0;    text-align: center;    line-height: 60rpx;  }  .allAddress .nav .item:nth-of-type(1).on2::before {    content: "快递配送";    border-width: 0 60rpx 60rpx 0;    border-radius: 14rpx 36rpx 0 0;  }  .allAddress .address {    width: 690rpx;    max-height: 180rpx;    margin: 0 auto;  }  .allAddress .line {    width: 100%;    margin: 0 auto;  }</style>
 |