HarmonyOS应用开发快速入门(5):指令/export导出,指令/import导入,MVVM,页面的生命周期,resourceManager库,JSON库,HAP签名【重发】

发布时间:2026/11/2 8:12:06

HarmonyOS应用开发快速入门(5):指令/export导出,指令/import导入,MVVM,页面的生命周期,resourceManager库,JSON库,HAP签名【重发】 src/main/ets/pages/Index.etsimport { TutorialView } from ../view/TutorialView; import { Banner } from ../view/Banner; import { EnablementView } from ../view/EnablementView; Entry Component struct Index { // 结构/索引 State message: string 快速入门; // 变量/消息 build() { Column() { // 列方向铺展的对象 Text(this.message) .fontSize(24) // 字体大小 .fontWeight(700) // 笔画粗细 .width(100%) // 对象的容器的相对宽度 .textAlign(TextAlign.Start) // 对齐方式 .padding({ left: 16 }) // 对象的内部的左侧的填充 .fontFamily(HarmonyHeiTi-Bold) // 字体 .lineHeight(30) // 自上向下的行高 Scroll() { Column() { Banner() EnablementView() TutorialView() } } .layoutWeight(1) .scrollBar(BarState.Off) .align(Alignment.TopStart) } .height(100%) // 对象的容器的相对高度 .width(100%) .backgroundColor(#F1F3F5) // 背景色 } }src/main/ets/util/BufferUtil.etsimport { util } from kit.ArkTS; export function bufferToString(buffer: Uint8Array): string { let textDecoder util.TextDecoder.create(utf-8, { ignoreBOM: true }); let resultPut textDecoder.decodeToString(buffer); return resultPut; }src/main/ets/view/Banner.etsimport { BannerClass } from ../model/BannerClass; import { bufferToString } from ../util/BufferUtil; Preview Component export struct Banner { State bannerList: BannerClass[] []; aboutToAppear(): void { // build之前执行 this.getBannerDataFromJSON(); } /* 获取原生文件内容: */ getBannerDataFromJSON() { getContext(this).resourceManager.getRawFileContent(BannerData.json).then(value { let res: string bufferToString(value); this.bannerList JSON.parse(res) as BannerClass[]; // this.bannerList JSON.parse(bufferToString(value)) as BannerClass[]; }) } build() { Swiper() { // 滑动和轮播的对象 ForEach(this.bannerList, (item: BannerClass, index: number) { Image($r(item.imageSrc)) .objectFit(ImageFit.Contain) // 图片的适配的方式 .width(100%) .padding({ top: 11, left: 16, right: 16 }) .borderRadius(16) }, (item: BannerClass, index: number) item.id) } .autoPlay(true) // 自动轮播 .loop(true) // 循环播放 .indicator( // 指示器 new DotIndicator() // 点状指示器 .color(#1a000000) // 颜色 .selectedColor(#0A59F7) // 选中的颜色 ) } }src/main/ets/view/EnablementView.etsimport { ArticleClass } from ../model/ArticleClass; import { bufferToString } from ../util/BufferUtil; // Preview Component struct EnablementItem { Prop enablementItem: ArticleClass; // 接收数据 build() { Column() { Image($r(this.enablementItem.imageSrc)) .width(100%) .objectFit(ImageFit.Cover) .height(96) // 绝对高度拉伸图片 .borderRadius({ // 左上角和右上角圆角 topLeft: 16, topRight: 16 }) Text(this.enablementItem.title) .height(19) .width(100%) .fontSize(14) .textAlign(TextAlign.Start) // 文本对齐 .textOverflow({ overflow: TextOverflow.Ellipsis }) // 文本溢出的处理方式 .maxLines(1) // 最大行数 .fontWeight(400) .padding({ left: 12, right: 12 }) .margin({ top: 8 }) // 边距 Text(this.enablementItem.title) .height(32) .width(100%) .fontSize(12) .textAlign(TextAlign.Start) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(2) .fontWeight(400) .fontColor(rgba(0, 0, 0, 0.6)) // 字体颜色 .padding({ left: 12, right: 12 }) .margin({ top: 2 }) } .width(160) .height(169) .borderRadius(16) .backgroundColor(Color.White) // 白色 } } Component export struct EnablementView{ State enablementList: ArticleClass[] []; aboutToAppear(): void { // build之前执行 this.getBannerDataFromJSON(); } /* 获取原生文件内容: */ getBannerDataFromJSON() { getContext(this).resourceManager.getRawFileContent(EnablementData.json).then(value { let res: string bufferToString(value); this.enablementList JSON.parse(res) as ArticleClass[]; // this.bannerList JSON.parse(bufferToString(value)) as BannerClass[]; }) } build() { Column() { Text(赋能套件) .fontColor(#182431) .fontSize(16) .fontWeight(500) .fontFamily(HarmonyHeiTi-medium) .textAlign(TextAlign.Start) .padding({ left: 16 }) .margin({ bottom: 8.5 }) Grid() { ForEach(this.enablementList, (item: ArticleClass) { GridItem() { EnablementItem({ enablementItem: item }) } }, (item: ArticleClass) item.id) } .rowsTemplate(1fr) // 元素行的数量 .columnsGap(8) // 元素的列的间距 .scrollBar(BarState.Off) // 关闭滚动状态的滚动条 .height(169) .padding({ top: 2, left: 16, right: 16 }) } .margin({ top: 18 }) .alignItems(HorizontalAlign.Start) // 左侧水平对齐 } }src/main/ets/view/TutorialView.etsimport { ArticleClass } from ../model/ArticleClass; import { bufferToString } from ../util/BufferUtil; Preview Component struct TutorialItem { Prop tutorialItem: ArticleClass; build() { Row() { // 行方向自左向右铺展的对象 Column() { Text(this.tutorialItem.title) .height(19) .width(100%) .fontSize(14) .textAlign(TextAlign.Start) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(1) .fontWeight(400) .margin({ top: 4 }) Text(this.tutorialItem.brief) .height(32) .width(100%) .fontSize(12) .textAlign(TextAlign.Start) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(2) .fontWeight(400) .fontColor(rgba(0, 0, 0, 0.6)) .margin({ top: 5 }) } .height(100%) .layoutWeight(1) .alignItems(HorizontalAlign.Start) .margin({ right: 12 }) // 容器相对外部容器的距离 Image($r(this.tutorialItem.imageSrc)) .height(64) .width(108) .objectFit(ImageFit.Cover) .borderRadius(16) } .width(100%) .height(88) .borderRadius(16) .backgroundColor(Color.White) .padding(12) .alignItems(VerticalAlign.Top) // 容器内部元素的对齐 } } Component export struct TutorialView{ State tutorialList: ArticleClass[] []; aboutToAppear(): void { // build之前执行 this.getBannerDataFromJSON(); } /* 获取原生文件内容: */ getBannerDataFromJSON() { getContext(this).resourceManager.getRawFileContent(EnablementData.json).then(value { let res: string bufferToString(value); this.tutorialList JSON.parse(res) as ArticleClass[]; // this.bannerList JSON.parse(bufferToString(value)) as BannerClass[]; }) } build() { Column() { Text(入门教程) .fontColor(#182431) .fontSize(16) .fontWeight(500) .fontFamily(HarmonyHeiTi-medium) .textAlign(TextAlign.Start) .padding({ left: 16 }) .margin({ bottom: 8.5 }) List({ space: 12 }) { ForEach(this.tutorialList, (item: ArticleClass) { ListItem() { TutorialItem({ tutorialItem: item }) } }, (item: ArticleClass) item.id) } .scrollBar(BarState.Off) .padding({ left: 16, right: 16 }) } .margin({ top: 18 }) .alignItems(HorizontalAlign.Start) } }src/main/resources/rawfile/多项资源MVVMModel, View, ViewModel数据结构和数据构成的模型和视图关联数据获取的页面的生命周期应用架构设计基础——MVVM模式-HarmonyOS应用开发快速入门-Codelabs-华为开发者联盟
延伸阅读

更多相关文章

2026/10/25 1:36:06

流批安卓自动点击神器,轻松搞定重复操作

今天给大家介绍一款安卓端的自动点击神器——“自动精灵”。这款软件通过录制脚本,就能轻松实现自动点击功能,非常适合需要频繁进行重复操作的用户。这款软件凭借其强大的自动化功能,为用户带来了前所未有的便捷体验,堪称手机操作…

2026/10/24 1:39:44

从A.dx到数值积分:工程实践中的微积分核心操作指南

1. 项目概述:从“A. dx 分计算”看积分计算的实战化理解最近在整理一些工程计算和数据分析的笔记时,翻到了一个以前随手记下的标题:“A. dx 分计算”。乍一看,这像是一个数学符号的误写或简写,但仔细琢磨,它…

2026/11/2 8:10:20

智能数据分析工具如何助力人文社科研究

1. 项目概述:打破学科壁垒的数据分析革命当我在大学图书馆看到文科研究生对着Excel表格抓耳挠腮时,突然意识到一个残酷现实:在实证研究成为主流的今天,数据能力缺失正在扼杀多少人文社科学者的学术潜力。这正是宏智树AI最新推出的…

2026/11/2 8:10:20

2026大模型学习全景图:工具、框架与实战路线

2026年聊大模型学习,和三四年前完全是两个画风。当年大家还在纠结“怎么把环境跑通”,现在的问题早就变成了“生态太庞大,不知道把精力放在哪”。终端工具、微调框架、Agent中间件、部署方案、垂直领域路线,每一块都有大量选择&am…

2026/11/2 8:10:20

分库分表本质与落地决策指南:从瓶颈识别到分片策略

1. 这不是“加机器”能解决的问题:分库分表到底在解决什么?你有没有遇到过这样的场景:某天凌晨三点,监控告警疯狂弹窗——数据库CPU飙到98%,慢查询日志里全是“SELECT * FROM order WHERE user_id ?”这种语句&#…

2026/11/2 8:10:20

AI服务响应异常根因排查:缓存击穿与故障转移风暴

那个周日晚上的告警,我现在还记得很清楚:群里一下子弹出十几条,AI 服务 P95 延迟从 280ms 直接飙到 3.8 秒,错误率破 2%,已经持续了快十分钟才被值班同事捞起来。这是这个月第二次因为“线上响应异常”被拉进复盘会议室…

2026/11/2 8:10:20

Vue开发者必懂的Event Loop底层原理与实战调试

1. 为什么Vue开发者必须亲手拆解Event Loop——从一个v-model失效的深夜debug说起去年冬天&#xff0c;我在带一个前端新人做某高校实验室的跨平台数据看板项目。页面里有个实时更新的传感器数值输入框&#xff0c;用的是最基础的<input v-model"sensorValue">…

2026/11/2 8:05:19

Transformer凭什么打败LSTM?揭秘Google那个20%提升的真相

Transformer 打败 LSTM&#xff0c;Google 那个 20% 到底是怎么来的&#xff1f;做 NLP 的人&#xff0c;这两年应该都有一个很直观的感受&#xff1a;LSTM 正在从我们的工具箱里慢慢消失。不管是 TensorFlow 还是 PyTorch&#xff0c;新开的项目里默认 baseline 几乎全是 Tran…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代&#xff0c;基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而&#xff0c;与配合度高的人类不同&#xff0c;宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态&#xff0c;更无法控制光照环境。实际应用中&#xff0c;我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代&#xff0c;基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而&#xff0c;与配合度高的人类不同&#xff0c;宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态&#xff0c;更无法控制光照环境。实际应用中&#xff0c;我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑