HarmonyOS 鸿蒙Next学习例程2:简单互动九宫格 之一
HarmonyOS 鸿蒙Next学习例程2:简单互动九宫格 之一 掰持了一晚上,终于把这个简单互动逻辑搞明白。
涉及到状态管理 @Sate @Observed @ObjectLink 自定义组件
先上图,再说学习痛点

代码如下:
@Entry
@Component
struct Index {
[@State](/user/State) message: string = '鸿蒙开发初探 → 互动 九宫格';
[@State](/user/State)
cells:Array<JiuGongGe>=
[
new JiuGongGe('1'),new JiuGongGe('2'),new JiuGongGe('3'),
new JiuGongGe('4'),new JiuGongGe('5'),new JiuGongGe('6'),
new JiuGongGe('7'),new JiuGongGe('8'),new JiuGongGe('9')
]
build() {
Column() {
Text(this.message)
.id('HelloWorld')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.fontColor('#080888')
.width('100%')
.textAlign(TextAlign.Start)
.padding({top:5,left:15})
Grid() {
ForEach(this.cells, (item: JiuGongGe, index: number) => {
GridItem() {
JiuGongGeComponent({cell:item})
}
},)
}
.columnsTemplate('1fr 1fr 1fr')
.rowsTemplate('1fr 1fr 1fr')
.columnsGap(10)
.rowsGap(10)
.height(300)
.margin({top:10,left:10,right:10})
}
.height('100%')
.width('100%')
.backgroundColor('#F1F3F5')
}
}
[@Observed](/user/Observed)
class JiuGongGe
{
text:string='Cell'
selected:boolean=false
constructor(text:string) {
this.text=text
}
}
@Component
struct JiuGongGeComponent {
[@ObjectLink](/user/ObjectLink) cell:JiuGongGe
build() {
Text(this.cell.text)
.fontSize(16)
.fontColor(Color.White)
.backgroundColor(this.cell.selected? 0x007DFF:0x0000)
.width('100%')
.height('100%')
.textAlign(TextAlign.Center)
.borderRadius(15)
.onClick((event:ClickEvent)=>{
this.cell.selected=!this.cell.selected
})
}
}
重要参考: 如何解决使用@State修饰对象数组,数据变化时页面不刷新问题 https://developer.huawei.com/consumer/cn/doc/architecture-guides/develop-arkui-44-0000002069443792
**痛点1:**如何使用 Grid控件,想批量生成单元格就要用到 ForEach , 用到数组。
**痛点2:**直接使用数组,点击 【单元格】 中的 【Text控件】 后,onClick事件修改状态无法被记录,界面不刷新
**痛点3:**查了好久,才知道需要将【自定义类】打上 @Observed 标记;然后自定义组件,在组件中声明类实例,打上 @ObjectLink标
走了一大圈冤枉路。好在搞定!
更多关于HarmonyOS 鸿蒙Next学习例程2:简单互动九宫格 之一的实战教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next简单互动九宫格例程
该例程主要涉及ArkTS/TypeScript开发,使用Grid组件构建九宫格布局,并通过@State装饰器管理每个格子的状态(如点击标记)。
核心实现
- 布局:使用Grid组件构建九宫格。
- 状态管理:通过@State装饰器管理格子状态(如点击标记)。
- 交互逻辑:点击格子后切换其显示内容或样式,可能涉及胜负判断。
- 技术基础:基于声明式UI和状态管理,不依赖Java或C语言。
更多关于HarmonyOS 鸿蒙Next学习例程2:简单互动九宫格 之一的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
你的实现非常棒,清晰地展示了HarmonyOS Next中状态管理的关键用法。你准确地抓住了使用@Observed和@ObjectLink来处理复杂对象数组状态更新的核心要点。
你的代码结构是标准的解决方案:
- 数据模型类 (
JiuGongGe) 使用@Observed装饰器,这告知ArkUI框架需要深度观察这个类的属性变化。 - 父组件 (
Index) 使用@State装饰器管理一个由JiuGongGe对象组成的数组 (cells)。当整个数组被替换时,会触发UI更新。 - 子组件 (
JiuGongGeComponent) 通过@ObjectLink装饰器接收一个JiuGongGe对象的引用。@ObjectLink会与@Observed类协同工作,建立双向数据同步。当子组件内修改this.cell.selected时,这个变化会直接同步到@State所管理的数组中的对应对象,从而触发关联组件的UI刷新。
你遇到的“痛点”正是学习ArkUI状态管理的关键路径。直接使用普通对象数组,框架无法感知对象内部属性的变化。@Observed 和 @ObjectLink 的组合正是为了解决这类“嵌套对象”或“对象数组”的状态管理问题,它允许框架监控到对象内部属性的变更。
这个九宫格例程是一个很好的教学案例,它实践了从简单状态到复杂状态管理的进阶,对于理解HarmonyOS Next应用开发中的数据流至关重要。

