uniapp项目之小兔鲜儿小程序商城(六) 地址模块:地址管理页的实现,地址表单页的实现

0.地址模块

地址模块共两个页面:地址管理页 address.vue和地址表单页address-form.vue,两个页面都作为会员中心页my.vue的分包,可以在pageMember路径下创建:新建uniapp 页面(分包)

业务流程:

`my`页点击我的收货地址可以跳转到`address`,该页负责地址的管理(增删改),
点击删除可以在当前页操作,点击增加或修改时会跳转到`address-form`,并根据是否传入id来区分具体是增加还是修改

在这里插入图片描述

1.静态结构
  • 新建src/pageMember/address/address.vue,并准备静态页面如下
<script setup lang="ts">
//
</script>
 
<template>
  <view class="viewport">
    <!-- 地址列表 -->
    <scroll-view class="scroll-view" scroll-y>
      <view v-if="true" class="address">
        <view class="address-list">
          <!-- 收货地址项 -->
          <view class="item">
            <view class="item-content">
              <view class="user">
                黑马小王子
                <text class="contact">13111111111</text>
                <text v-if="true" class="badge">默认</text>
              </view>
              <view class="locate">广东省 广州市 天河区 黑马程序员</view>
              <navigator
                class="edit"
                hover-class="none"
                :url="`/pagesMember/address-form/address-form?id=1`"
              >
                修改
              </navigator>
            </view>
          </view>
          <!-- 收货地址项 -->
          <view class="item">
            <view class="item-content">
              <view class="user">
                黑马小公主
                <text class="contact">13222222222</text>
                <text v-if="false" class="badge">默认</text>
              </view>
              <view class="locate">北京市 北京市 顺义区 黑马程序员</view>
              <navigator
                class="edit"
                hover-class="none"
                :url="`/pagesMember/address-form/address-form?id=2`"
              >
                修改
              </navigator>
            </view>
          </view>
        </view>
      </view>
      <view v-else class="blank">暂无收货地址</view>
    </scroll-view>
    <!-- 添加按钮 -->
    <view class="add-btn">
      <navigator hover-class="none" url="/pagesMember/address-form/address-form">
        新建地址
      </navigator>
    </view>
  </view>
</template>
 
<style lang="scss">
page {
   
   
  height: 100%;
  overflow: hidden;
}
 
/* 删除按钮 */
.delete-button {
   
   
  display: flex;
  justify-content: center;
  align-items: center;
  width: 50px;
  height: 100%;
  font-size: 28rpx;
  color: #fff;
  border-radius: 0;
  padding: 0;
  background-color: #cf4444;
}
 
.viewport {
   
   
  display: flex;
  flex-direction: column;
  height: 100%;
  background-color: #f4f4f4;
 
  .scroll-view {
   
   
    padding-top: 20rpx;
  }
}
 
.address {
   
   
  padding: 0 20rpx;
  margin: 0 20rpx;
  border-radius: 10rpx;
  background-color: #fff;
 
  .item-content {
   
   
    line-height: 1;
    padding: 40rpx 10rpx 38rpx;
    border-bottom: 1rpx solid #ddd;
    position: relative;
 
    .edit {
   
   
      position: absolute;
      top: 36rpx;
      right: 30rpx;
      padding: 2rpx 0 2rpx 20rpx;
      border-left: 1rpx solid #666;
      font-size: 26rpx;
      color: #666;
      line-height: 1;
    }
  }
 
  .item:last-child .item-content {
   
   
    border: none;
  }
 
  .user {
   
   
    font-size: 28rpx;
    margin-bottom: 20rpx;
    color: #333;
 
    .contact {
   
   
      color: #666;
    }
 
    .badge {
   
   
      display: inline-block;
      padding: 4rpx 10rpx 2rpx 14rpx;
      margin: 2rpx 0 0 10rpx;
      font-size: 26rpx;
      color: #27ba9b;
      border-radius: 6rpx;
      border: 1rpx solid #27ba9b;
    }
  }
 
  .locate {
   
   
    line-height: 1.6;
    font-size: 26rpx;
    color: #333;
  }
}
 
.blank {
   
   
  margin-top: 300rpx;
  text-align: center;
  font-size: 32rpx;
  color: #888;
}
 
.add-btn {
   
   
  height: 80rpx;
  text-align: center;
  line-height: 80rpx;
  margin: 30rpx 20rpx;
  color: #fff;
  border-radius: 80rpx;
  font-size: 30rpx;
  background-color: #27ba9b;
}
</style>
  • 新建src/pageMember/address-form/address-form.vue,并准备静态页面如下
<script setup lang="ts">
import {
   
    ref } from 'vue'

// 表单数据
const form = ref({
   
   
  receiver: '', // 收货人
  contact: '', // 联系方式
  fullLocation: '', // 省市区(前端展示)
  provinceCode: '', // 省份编码(后端参数)
  cityCode: '', // 城市编码(后端参数)
  countyCode: '', // 区/县编码(后端参数)
  address: '', // 详细地址
  isDefault: 
UniApp 开发微信小程序时,`scroll-view` 组件无法正常显示的问题可能与高度计算、布局结构、条件渲染以及滚动事件控制等多方面因素有关。以下是针对该问题的解决方案和优化建议。 ### 1. 确保设置明确的高度 `scroll-view` 组件在默认情况下不会自动获取高度,需要显式地设置其 `style` 或 `class` 中的 `height` 属性。在微信小程序中,如果未指定高度,组件将不会渲染内容区域。 ```html <scroll-view scroll-y style="height: 100%;"> <!-- 内容 --> </scroll-view> ``` 如果使用 `v-if` 控制渲染,需要确保在组件渲染时,其父容器的高度已经确定,否则可能导致 `scroll-view` 高度为 0。 ```html <view v-if="isContentLoaded"> <scroll-view scroll-y style="height: 100%;"> <!-- 内容 --> </scroll-view> </view> ``` ### 2. 使用 `v-if` 控制组件渲染时机 根据引用[1]中提到的方法,可以使用 `v-if` 条件渲染确保组件在高度可用后再进行渲染。在 Vue 语法中,可使用如下方式: ```html <scroll-view v-if="height > 0" scroll-y :style="{ height: height + &#39;px&#39; }"> <!-- 内容 --> </scroll-view> ``` 在微信小程序原生开发中,可使用 `wx:if` 实现类似逻辑: ```html <scroll-view wx:if="{{height > 0}}" scroll-y style="height: {{height}}px;"> <!-- 内容 --> </scroll-view> ``` ### 3. 处理滚动区域未被占满时的行为 如果 `scroll-view` 内容高度不足以触发滚动,但希望其保持固定高度并具备滚动能力,可参考引用[3]中提到的方案: - **方案一**:通过设置 `padding-top` 替代子元素的 `margin-top`。 - **方案二**:在 `scroll-view` 内部插入一个固定高度的空白 `view` 元素。 - **方案三**:将所有子元素包裹在一个容器中,并设置容器的宽高为 100%。 ```html <scroll-view scroll-y style="height: 100%"> <view style="height: 100%"> <!-- 所有子元素 --> </view> </scroll-view> ``` ### 4. 检查样式与布局嵌套 确保 `scroll-view` 的父容器具备明确的高度,且没有设置 `overflow: hidden` 等影响布局的属性。在某些布局中,Flex 容器可能导致子元素高度计算异常,可尝试使用绝对定位或固定高度方式。 ### 5. 使用 `@scrolltoupper` 和 `@scrolltolower` 监听滚动事件 如引用[2]所示,可以为 `scroll-view` 添加滚动事件监听器,用于调试内容是否可滚动,以及判断内容是否加载完成。 ```html <scroll-view scroll-y style="height: 100%" @scrolltoupper="upper" @scrolltolower="lower"> <!-- 内容 --> </scroll-view> ``` 在脚本中定义事件处理函数: ```javascript methods: { upper() { console.log(&#39;滚动到顶部&#39;); }, lower() { console.log(&#39;滚动到底部&#39;); } } ``` ### 6. 回到顶部功能实现 若需要实现“回到顶部”功能,可结合 `scroll-top` 属性进行控制: ```html <scroll-view scroll-y :scroll-top="scrollTop" style="height: 100%"> <!-- 内容 --> </scroll-view> ``` 在数据中定义 `scrollTop` 并提供方法重置其值: ```javascript data() { return { scrollTop: 0 }; }, methods: { scrollToTop() { this.scrollTop = 0; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值