发布时间:2026/7/30 3:02:09
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/7/30 2:57:09

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

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

2026/7/30 2:57:09

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

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

2026/7/30 3:52:11

STM32硬件SPI驱动3线LCD:从原理到DMA优化实践

1. 项目概述:为什么选择硬件SPI驱动3线LCD?在嵌入式显示项目中,驱动一块SPI接口的LCD屏是再常见不过的需求。很多开发者,尤其是刚接触STM32的朋友,可能会图省事直接用GPIO模拟SPI时序,也就是我们常说的“软…

2026/7/30 3:52:11

微软一天连发3篇之:打造自己的Harness原生Agents

就在前几天,抱抱脸 Daily Papers 上微软一口气挂出三篇论文——《LLMs Get Lost in Evolving User Intent》《Multi-Turn On-Policy Distillation with Prefix Replay》,以及本篇主角 OpenForge RL。[HarnessModel双引擎驱动的长程Agents最新综述] 现在的…

2026/7/30 3:47:11

Excel+Python+Stata三驾马车:高效构建面板数据的工程化实践

1. 项目缘起:为什么我们需要“三驾马车”来构建面板数据?做实证研究或者数据分析的朋友,尤其是经管、社科领域的,对“面板数据”这个词肯定不陌生。简单说,面板数据就是跟踪同一批个体(比如公司、省份、家庭…

2026/7/29 22:32:30

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/30 0:01:39

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:01:39

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/29 13:12:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…