HarmonyOS NEXT 中级开发笔记:ArkTS实现家庭菜谱应用

65 阅读1分钟

最近在尝试用ArkTS应用开发语言为HarmonyOS NEXT开发一个家庭菜谱应用,记录一下实现过程中的关键点。这个应用主要功能是展示菜谱列表和详情,支持收藏功能,界面采用声明式UI开发。

 

数据模型与状态管理****

首先定义菜谱数据模型,使用ArkTS的类与接口:

typescript

 

`interface Ingredient {

  name: string;

  amount: string;

}

 

class Recipe {

  id: number;

  name: string;

  difficulty: string;

  ingredients: Ingredient[];

  steps: string[];

  isFavorite: boolean = false;

 

  constructor(id: number, name: string, difficulty: string) {

    this.id = id;

    this.name = name;

    this.difficulty = difficulty;

  }

} `  

声明式UI实现****

通过@Entry和@Component装饰器构建页面,使用Flex布局:

typescript

 

`@Entry

@Component

struct RecipeListPage {

  @State recipes: Recipe[] = [

    new Recipe(1, "番茄炒蛋", "简单"),

    new Recipe(2, "红烧排骨", "中等")

  ];

 

  build() {

    Column() {

      List({ space: 10 }) {

        ForEach(this.recipes, (item: Recipe) => {

          ListItem() {

            RecipeItem({ recipe: item })

          }

        })

      }

      .layoutWeight(1)

      .width('100%')

    }

    .height('100%')

    .padding(12)

  }

}

 

@Component

struct RecipeItem {

  @Prop recipe: Recipe;

 

  build() {

    Row() {

      Image($r('app.media.food_icon'))

        .width(40)

        .height(40)

      Column() {

        Text(this.recipe.name)

          .fontSize(18)

        Text(难度: ${this.recipe.difficulty})

          .fontColor('#666')

      }

      .margin({ left: 10 })

    }

    .width('100%')

    .justifyContent(FlexAlign.Start)

  }

} `  

交互与状态更新****

通过@State和事件处理实现收藏功能:

typescript

  ` @Component

struct RecipeDetailPage {

  @State recipe: Recipe;

 

  build() {

    Column() {

      Text(this.recipe.name)

        .fontSize(22)

      Button(this.recipe.isFavorite ? '已收藏' : '收藏')

        .onClick(() => {

          this.recipe.isFavorite = !this.recipe.isFavorite;

        })

    }

  }

} `  

在HarmonyOS NEXT上开发时,ArkTS应用开发语言的静态类型检查确实能减少运行时错误,声明式UI的写法也比传统命令式更直观。不过部分API的文档还在完善中,需要多尝试不同写法。

(注:代码示例基于HarmonyOS NEXT API12版本验证,实际开发时建议参考最新官方文档)