清道夫微信小程序使用 navigationStyle: custom 实现自定义导航栏。所有页面顶部的标题、返回按钮、功能按钮(通知、新增、筛选等)都由组件自行渲染。然而微信小程序右上角存在系统胶囊按钮(菜单 + 关闭),在 iPhone 上宽度约 87px、安卓上约 96px,且距离屏幕右侧有一定边距。当前部分页面把操作按钮直接放在右上角,导致真机运行时胶囊遮挡按钮。
已有组件:StatusBar.vue 负责状态栏占位,TopBar.vue 负责标题栏。两者均未考虑胶囊区域。
Goals:
TopBar.vue,使其右侧插槽内容自动避让胶囊。pages/home/home、pages/schedule/schedule、pages/task/task 的遮挡问题。Non-Goals:
CapsuleSafeArea.vue 组件uni.getMenuButtonBoundingClientRect() 获取胶囊坐标与宽度。uni.getSystemInfoSync() 获取屏幕宽度。screenWidth - menuButton.left + 8px(额外 8px 缓冲)。width 插槽 prop 或默认 slot,方便 TopBar 直接使用。TopBar.vue 集成安全区<slot name="right" /> 外层用 CapsuleSafeArea 包裹,使右侧内容左侧平移。flex-1 min-w-0 truncate。TopBarpages/home/home 三个首页当前直接在页面内写 header,需把右上角通知铃铛移入 TopBar 的 right slot,或给按钮加 mr-[safeWidth]。pages/task/task 的 TaskListView 顶部「新增」按钮纳入 TopBar right slot。pages/schedule/schedule 的 ScheduleView 顶部「今天」「新增排班」按钮纳入 TopBar right slot。uni.getMenuButtonBoundingClientRect() 在小程序初始化后可能异步变化(如旋转屏幕)。
onMounted 获取并监听窗口尺寸变化;如获取失败则使用基于屏幕宽度的默认估算值。truncate 截断,并确保左侧返回按钮只在需要时显示。CapsuleSafeArea.vue。TopBar.vue,集成安全区。TopBar right slot 渲染。npm run build:mp-weixin 验证无编译错误。StatusBar + TopBar,还是统一封装一个 PageHeader?本次保持最小改动,只改 TopBar。