
回复
本案例实现了一个课程分类展示系统,主要包含以下核心功能:
组件/装饰器 | 作用说明 |
---|---|
List | 构建可滚动列表容器(左侧分类列表和右侧课程列表) |
ForEach | 循环渲染分类和课程条目 |
@State | 管理组件状态(当前选中分类、数据加载状态) |
@Builder | 构建可复用的UI片段(列表分组头部) |
Scroller | 控制列表滚动行为 |
ListItemGroup | 创建带分组的列表项 |
StickyStyle.Header | 实现分组头部粘滞效果 |
主要交互流程说明:
scrollToIndex
控制右侧列表滚动onScrollIndex
监听首项索引,反向控制左侧分类选中状态sticky
属性实现分组头部粘滞scrollBar(BarState.Off)
隐藏滚动条edgeEffect(EdgeEffect.None)
禁用边缘发光效果示例图
初始化阶段:通过setTimeout模拟异步数据加载,设置500ms延迟(实际开发中应替换为真实API调用)
currentClassify
:当前选中的分类索引。requestSuccess
:数据加载是否成功的状态标志。classifyList
:分类数据列表。classifyScroller
和scroller
:用于控制分类列表和课程列表的滚动。@State currentClassify: number = 0; // selected classify index.
@State requestSuccess: boolean = false; // is loading data.
private classifyList: Array<ClassifyModel> = [];
private classifyScroller: Scroller = new Scroller();
private scroller: Scroller = new Scroller();
aboutToAppear() {
// loading data.
setTimeout(() => {
this.classifyList = ClassifyViewModel.getLinkData();
this.requestSuccess = true;
}, Constants.LOADING_DURATION);
}
build
方法用于构建页面的UI布局。List
组件渲染分类列表和课程列表。classifyList
用于渲染分类列表,每个分类项使用ClassifyItem
组件展示。classifyList
中的每个分类项包含多个课程项,使用ListItemGroup
组件按分类分组展示。build() {
Row() {
if (this.requestSuccess) {
List({ scroller: this.classifyScroller }) {
ForEach(this.classifyList, (item: ClassifyModel, index?: number) => {
ListItem() {
ClassifyItem({
classifyName: item.classifyName,
isSelected: this.currentClassify === index,
onClickAction: () => {
if (index !== undefined) {
this.classifyChangeAction(index, true);
}
}
})
}
}, (item: ClassifyModel) => item.classifyName.toString() + this.currentClassify)
}
.height(Constants.FULL_PERCENT)
.width($r('app.float.classify_item_width'))
.backgroundColor($r('app.color.classify_background'))
.scrollBar(BarState.Off)
List({ scroller: this.scroller }) {
ForEach(this.classifyList, (classifyItem: ClassifyModel) => {
ListItemGroup({
header: this.ClassifyHeader(classifyItem.classifyName),
space: Constants.COURSE_ITEM_PADDING
}) {
ForEach(classifyItem.courseList, (courseItem: CourseModel) => {
ListItem() {
CourseItem({ itemStr: JSON.stringify(courseItem) })
}
}, (courseItem: CourseModel) => `${courseItem.courseId}`)
}
}, (item: ClassifyModel) => `${item.classifyId}`)
}
.height(Constants.FULL_PERCENT)
.width(Constants.FULL_PERCENT)
.padding({ left: $r('app.float.item_padding_left'), right: $r('app.float.course_item_padding') })
.sticky(StickyStyle.Header)
.layoutWeight(1)
.edgeEffect(EdgeEffect.None)
.onScrollIndex((start: number) => this.classifyChangeAction(start, false))
} else {
Text($r('app.string.loading'))
.fontFamily($r('app.string.hei_ti_medium'))
.textAlign(TextAlign.Center)
.height(Constants.FULL_PERCENT)
.width(Constants.FULL_PERCENT)
}
}
.backgroundColor($r('app.color.base_background'))
}
scrollToIndex
控制右侧列表滚动onScrollIndex
监听首项索引,反向控制左侧分类选中状态sticky
属性实现分组头部粘滞scrollBar(BarState.Off)
隐藏滚动条edgeEffect(EdgeEffect.None)
禁用边缘发光效果如果你兴趣想要了解更多的开发细节和最新资讯,欢迎在评论区留言或者私信或者看我个人信息,可以加入技术交流群。