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

2 回复

鸿蒙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来处理复杂对象数组状态更新的核心要点。

你的代码结构是标准的解决方案:

  1. 数据模型类 (JiuGongGe) 使用 @Observed 装饰器,这告知ArkUI框架需要深度观察这个类的属性变化。
  2. 父组件 (Index) 使用 @State 装饰器管理一个由 JiuGongGe 对象组成的数组 (cells)。当整个数组被替换时,会触发UI更新。
  3. 子组件 (JiuGongGeComponent) 通过 @ObjectLink 装饰器接收一个 JiuGongGe 对象的引用。@ObjectLink 会与 @Observed 类协同工作,建立双向数据同步。当子组件内修改 this.cell.selected 时,这个变化会直接同步到 @State 所管理的数组中的对应对象,从而触发关联组件的UI刷新。

你遇到的“痛点”正是学习ArkUI状态管理的关键路径。直接使用普通对象数组,框架无法感知对象内部属性的变化。@Observed@ObjectLink 的组合正是为了解决这类“嵌套对象”或“对象数组”的状态管理问题,它允许框架监控到对象内部属性的变更。

这个九宫格例程是一个很好的教学案例,它实践了从简单状态到复杂状态管理的进阶,对于理解HarmonyOS Next应用开发中的数据流至关重要。

回到顶部