当前位置: 首页 > news >正文

鸿蒙(OpenHarmony)声明式 UI 开发入门:从「智慧校园」项目学基础语法

鸿蒙(OpenHarmony)作为国产开源操作系统,其应用开发采用 ArkUI 声明式框架,通过简洁的「组件 + 状态」语法实现界面与逻辑的解耦。本文结合我个人学习时写的「智慧校园」项目的实际代码,带初学者快速掌握鸿蒙开发的核心语法。

一、基础结构:组件(Component)与声明式 UI

鸿蒙应用的界面由 @Component 装饰的结构体(struct)定义,每个结构体对应一个可复用的 UI 组件。组件的界面布局通过 build() 方法内的组件嵌套实现,遵循「代码即界面(What You Code Is What You Get)」原则。

示例:登录页组件(LoginPage.ets)

// LoginPage.ets
@Entry  // 标记为应用入口组件(整个应用仅一个)
@Component  // 声明该结构体为UI组件
struct LoginPage {// 组件私有状态:@State装饰的变量变化时,UI会自动更新@State password: string = '';@State name: string = '';// 界面构建核心方法:所有UI布局均在此定义build() {// 垂直布局容器(Column):子组件从上到下排列Column() {// 1. 标题图片区域(水平布局Row,确保图片居中)Row() {Image($r('app.media.tb'))  // 引用媒体资源(tb为图片名,需在resources目录配置).width(80)  // 设置图片宽度.margin({ top: 20 })  // 图片顶部外边距20}// 2. 输入框组(垂直布局Column,用户名+密码输入框上下排列)Column() {// 用户名输入框(水平布局Row,确保输入框居中)Row() {TextInput({ placeholder: '请输入用户名' })  // 文本输入组件,提示文字为“请输入用户名”.onChange((value) => {  // 输入内容变化时触发的回调this.name = value;  // 将输入值同步到状态变量name}).width('80%')  // 输入框宽度占父容器(Column)的80%.height(40)  // 输入框高度固定40}// 密码输入框(带密码隐藏模式)Row() {TextInput({ placeholder: '请输入密码' }).onChange((value) => this.password = value)  // 简化写法:直接同步输入值到password.type(InputType.Password)  // 开启密码模式,输入内容隐藏为圆点.width('80%')  // 与用户名输入框宽度一致,保持界面整齐}}}}
}

关键语法点

  • @Component:标记结构体为 UI 组件,必须包含 build() 方法(用于定义界面布局)。
  • @Entry:标记应用的「入口组件」(整个应用仅一个),决定应用启动时显示的初始界面。
  • $r('app.media.tb'):资源引用语法,app.media 表示资源目录中的「媒体资源文件夹」,tb 是具体资源名(需提前在 resources 目录中配置图片)。

二、状态管理:@State 实现 UI 自动更新

鸿蒙通过「状态装饰器」(如 @State@Link 等)实现「状态变量 → UI 界面」的自动同步。其中最常用的 @State 用于装饰组件的「私有状态变量」—— 当变量值变化时,组件会自动重新渲染相关 UI,无需手动调用刷新方法。

示例:登录页的输入同步逻辑

在 LoginPage 组件中,name 和 password 被 @State 装饰,实现输入内容与 UI 的实时同步:

ets

// 1. 定义@State状态变量(初始值为空字符串)
@State name: string = '';
@State password: string = '';// 2. 用户名输入框:输入变化时更新状态变量
TextInput({ placeholder: '请输入用户名' }).onChange((value) => {this.name = value;  // 输入内容变化 → 更新name变量})// 3. 密码输入框:简化写法(箭头函数直接赋值)
TextInput({ placeholder: '请输入密码' }).onChange((value) => this.password = value)  // 输入内容变化 → 更新password变量

核心逻辑:当用户在输入框中打字时,onChange 回调会实时获取输入值并更新 @State 变量;变量值变化后,系统会自动重新渲染输入框(无需手动操作),确保 UI 与状态一致。

三、组件复用:自定义可复用模块

鸿蒙支持将常用界面片段(如头部导航、按钮组)封装为「独立组件」,通过 export struct 导出后,其他组件可直接导入使用,大幅提升代码复用性和维护效率。

示例 1:通用头部组件(ListHader.ets)

ets

// ListHader.ets(通用头部组件,可复用)
@Component
export struct ListHader {  // export关键字:允许其他文件导入该组件build() {Column() {// 头部核心区域(包含Logo、标题、搜索框)Column() {// 1. Logo + 标题(水平布局Row)Row() {Image($r("app.media.log"))  // 引用Logo图片.width(40)  // Logo宽度固定40Text('智慧校园')  // 头部标题.fontColor('#fff')  // 字体颜色为白色}// 2. 搜索框(水平布局Row,确保搜索框居中)Row() {Search({ placeholder: '搜索课程、通知、新闻' })  // 系统内置搜索组件.backgroundColor('#fff')  // 搜索框背景色为白色.width('95%')  // 宽度占父容器95%,留少量边距}}.backgroundColor('#498fe0')  // 头部整体背景色(蓝色).height('17%')  // 高度占父容器17%,适配不同屏幕}}
}

示例 2:在首页中复用头部组件(HomeComponent.ets)

只需通过 import 导入组件,即可直接在 build() 方法中调用:

ets

// HomeComponent.ets(首页组件)
// 1. 导入自定义的ListHader组件(路径需与实际文件位置匹配)
import { ListHader } from "./ListHader"@Component
struct HomeComponent {build() {Column() {// 2. 直接调用复用组件(无需重复编写头部代码)ListHader()// 3. 首页其他内容(如轮播图、通知列表等)// ...(省略其他布局代码)}}
}

四、页面跳转:路由(Router)的使用

鸿蒙通过 router 模块实现「页面导航」,支持跳转到新页面、返回上一页等常见场景,需提前在项目配置中注册页面路径。

示例:点击通知跳转到详情页

在 HomeComponent 中,点击「开学通知」文本时,跳转到「通知详情页(TzPage)」:

ets

// HomeComponent.ets
// 1. 导入router模块(需提前配置依赖)
import router from '@ohos.router';@Component
struct HomeComponent {build() {Column() {// ...(其他布局:头部、轮播图等)// 2. 通知文本(点击触发跳转)Row() {Text('2025年春季开学通知').fontColor('#999')  // 字体颜色为浅灰色.onClick(() => {  // 点击事件回调// 跳转到TzPage(路径需与pages.json中注册的一致)router.push({ url: 'pages/TzPage' })})}}}
}

路由核心方法

方法作用场景
router.push({ url: '页面路径' })跳转到新页面,当前页面保留在「页面栈」中从首页→详情页、登录页→首页
router.back()返回上一页,当前页面从页面栈中移除从详情页→首页、设置页→个人中心页

五、常用 UI 组件:输入框与轮播图

鸿蒙提供丰富的「内置 UI 组件」,覆盖表单输入、图片展示、列表等常见场景,以下介绍「文本输入框(TextInput)」和「轮播图(Swiper)」的核心用法(TextInput 已在登录页示例中展示,此处重点讲 Swiper)。

示例:首页轮播图(Swiper 组件)

在 HomeComponent 中,使用 Swiper 组件实现自动轮播的图片展示:

ets

// HomeComponent.ets
@Component
struct HomeComponent {build() {Column() {// 1. 复用头部组件ListHader()// 2. 轮播图(Swiper容器,子组件为轮播图片)Swiper() {Image($r('app.media.xue3'))  // 轮播图1Image($r('app.media.xue2'))  // 轮播图2Image($r('app.media.xue1'))  // 轮播图3}.autoPlay(true)  // 开启自动轮播.width('100%')  // 轮播图宽度占满父容器.height('60%')  // 轮播图高度占父容器60%// 顶部圆角:topLeft和topRight设为4%,优化视觉效果.border({ radius: { topLeft: '4%', topRight: '4%' } })}}
}

Swiper 关键属性

  • autoPlay(true):开启自动轮播(默认关闭,需手动滑动)。
  • border({ radius: ... }):设置圆角,提升界面美观度。
  • indicatorStyle:可自定义轮播指示器(如圆点颜色、大小),默认显示底部圆点。

总结:鸿蒙声明式 UI 核心与实践步骤

鸿蒙声明式 UI 的核心是「组件 + 状态」—— 通过 @Component 定义界面模块,通过 @State 等装饰器管理状态,实现界面与逻辑的解耦。结合「智慧校园」项目,初学者可按以下步骤实践:

  1. 掌握基础装饰器:理解 @Component(定义组件)、@Entry(入口组件)、@State(状态管理)的作用,能写出简单的单页面组件(如登录页)。
  2. 封装复用组件:尝试将通用模块(如头部、按钮、列表项)封装为独立组件,通过 export/import 实现复用(如本文的 ListHader)。
  3. 实践页面跳转:使用 router 模块实现多页面导航,掌握 router.push(跳转)和 router.back(返回)的用法。
  4. 熟悉常用组件:练习 TextInput(输入)、Swiper(轮播)、List(列表)等内置组件,完成一个包含「登录页→首页→详情页」的完整流程。

通过实际编码调试,能更快理解鸿蒙声明式 UI 的逻辑,逐步掌握 OpenHarmony 应用开发的核心能力。

http://www.dtcms.com/a/461209.html

相关文章:

  • js移动开发框架
  • 【腾讯拥抱开源】Youtu-Embedding:基于CoDiEmb的一个协作而独特的框架,用于信息检索与语义文本相似性中的统一表征学习
  • 西蔵自治区建设厅网站wordpress防盗链插件
  • VSCode中使用conda activate 虚拟环境,没报错,但没进入环境
  • vue修改element-ui的默认的class
  • ModuleNotFoundError: No module named ‘UI_xiangmu‘
  • 网站建设方案及报价霍州做网站
  • mybatis-generator插件自动生成mapper及其实体模型配置
  • 计算机毕业设计 基于k-means的校园美食推荐系统 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【代码大模型-后门安全】Backdoors in Neural Models of Source Code
  • javaweb后端优雅处理枚举
  • 帝国cms小程序搞起来简直好用的不行
  • 高效批量调整图像尺寸的方案
  • 单片机供电处3.3V大电容导致程序可进调试但是无法暂停到具体语句
  • Java 实战:为 Word 文档中的文本与段落添加边框
  • 创业网站怎么做网站建设与网页设计...
  • git大文件储存机制是什么-为什么有大文件会出错并且处理大文件非常麻烦-优雅草卓伊凡
  • 机器学习之规则学习(Rule Learning)
  • 【神经网络】从逻辑回归到神经网络
  • 工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
  • 做外贸怎么看外国网站wordpress配置邮件发送
  • 使用Python对PDF进行拆分与合并
  • 嵌入式软件/硬件工程师面试答案
  • 6.DSP学习记录之定时器
  • 阳春新农村建设网站中铁建设集团有限公司西北分公司
  • 简化OffSec考试报告编写:OSCP-Exam-Report-Template-Markdown项目详解
  • 北京网站设计制作过程数据服务网站开发
  • Go基础:一文掌握Go语言网络编程
  • TENGJUN-3.5MM耳机插座(JA06-BPF032-A):反向沉板结构下的4极音频连接解决方案
  • 使用IOT-Tree接入各种设备转OPC UA Server输出