你正在为HarmonyOS应用开发相关功能。以下是你需要遵循的开发规则。
Tabs)构建导航,确保一致、高效的用户体验。@Builder装饰器封装可复用的UI模块,例如自定义底部页签的图标和文字组合 (TabItemBuilder)。@HMRouter注解为目标页面注册唯一的pageUrl,实现声明式路由配置。hitTestBehavior属性精确控制组件的触摸测试行为:
HitTestMode.Transparent: 组件自身响应,但允许事件继续向下或向上透传。HitTestMode.Block: 组件命中后独占事件,阻塞事件向兄弟节点和父组件传递。event.stopPropagation(),立即停止事件向上冒泡。Tabs组件作为底部导航容器,并设置barPosition: BarPosition.End。TabContent组件通过tabBar属性定义其对应的页签外观(包括选中和未选中状态的图标及文字)。Tabs的barMode: Fixed以平均分配页签宽度。HMRouterMgr.push()或HMRouterMgr.replace()方法进行页面跳转,并可通过param参数传递数据。aboutToAppear生命周期中,通过HMRouterMgr.getCurrentParam()获取跳转参数。push/replace方法的onResult回调中接收从其他页面返回的数据,并通过popInfo.srcPageInfo.name判断返回源页面。HitTestMode.Block或event.stopPropagation(),可能导致用户交互失效或应用行为异常。Navigation能力进行页面跳转和栈管理,应优先使用HMRouter提供的统一接口。// 手势冲突处理: 独占区域手势,不向上冒泡
Column() {
Text('点击我,事件在此终止')
}
.width('100%').height(100)
.backgroundColor(Color.Blue)
.hitTestBehavior(HitTestMode.Block) // 独占所有触摸事件
.onClick(() => {
console.log('Column clicked, event stopped here.');
})
// 底部页签导航 (简化示例)
Tabs({ barPosition: BarPosition.End }) {
TabContent() { Text('消息页面').fontSize(24) }
.tabBar(this.TabItemBuilder('消息', $r('app.media.message_icon'))) // 自定义页签样式
TabContent() { Text('我的页面').fontSize(24) }
.tabBar(this.TabItemBuilder('我的', $r('app.media.profile_icon')))
}
@Builder TabItemBuilder(text: string, icon: Resource) {
Column() {
Image(icon).width(24).height(24)
Text(text).fontSize(12)
}
}
// 页面跳转与参数传递,并接收返回结果
HMRouterMgr.push({
pageUrl: 'pages/DetailPage', // 目标页面路由
param: { id: 123, name: 'Product A' }, // 传递参数
onResult: (popInfo) => { // 接收返回结果
if (popInfo.srcPageInfo.name === 'pages/DetailPage') {
console.log('Returned from DetailPage with result:', popInfo.result);
}
}
});
// 避免不加区分地在父子组件上都使用onTouch,且不控制事件冒泡,这会增加手势冲突的风险。
// 避免在存在多个HMNavigation组件时,不指定HMRouterMgr跳转的navigationId,可能导致页面跳转到错误的栈。
hitTestBehavior和event.stopPropagation()时,务必充分测试,确保用户交互的连贯性和预期性。HMNavigation组件(如多窗口、多页面栈)时,务必为HMRouterMgr.push/replace方法明确指定正确的navigationId,以确保页面跳转到正确的导航栈。