做鸿蒙 App 一个月:10 个 ArkUI 大坑

做鸿蒙 App 一个月:10 个 ArkUI 大坑
在这里插入图片描述

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名)

大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。

我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案,
在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。

技术方向:前端 / 跨端 / 小程序 / 移动端工程化
内容平台:掘金、知乎、ZEEKLOG、简书
创作特点:实战导向、源码拆解、少空谈多落地
文章状态:长期稳定更新,大量原创输出

我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、真实项目中如何取舍,希望能帮你在实际工作中少走弯路。

子玥酱 · 前端成长记录官 ✨
👋 如果你正在做前端,或准备长期走前端这条路
📚 关注我,第一时间获取前端行业趋势与实践总结
🎁 可领取 11 类前端进阶学习资源(工程化 / 框架 / 跨端 / 面试 / 架构)
💡 一起把技术学“明白”,也用“到位”

持续写作,持续进阶。
愿我们都能在代码和生活里,走得更稳一点 🌱

文章目录

引言

最近一个月,我从传统 App(Android / Flutter)转向开发鸿蒙应用,用 ArkUI(ArkTS) 写了一个完整的项目。

一开始我以为:

“不就是一个声明式 UI 框架吗?”

但真正写下来才发现,ArkUI 的设计和传统 App 差别非常大

一个月下来,我踩了不少坑。

坑 1:状态没有用 @State,UI 不更新

很多刚写 ArkUI 的开发者,会这样写代码:

struct CounterPage { count:number=0build(){Column(){Text(`count: ${this.count}`)Button("Add").onClick(()=>{this.count++})}}}

你会发现:点击按钮 UI 不更新。

原因很简单:ArkUI 的 UI 是 响应式的,只有被声明为状态的变量才会触发刷新。

正确写法:

@Entry@Component struct CounterPage {@State count:number=0build(){Column(){Text(`count: ${this.count}`)Button("Add").onClick(()=>{this.count++})}}}

核心原则:

UI 依赖的数据必须是状态。

坑 2:组件参数忘记用 @Prop

很多人写组件时会这样写:

@Component struct UserCard { name:stringbuild(){Text(this.name)}}

在父组件使用:

UserCard({ name:"Tom"})

结果编译报错,原因是:ArkUI 的组件参数必须使用 @Prop 标记。

正确写法:

@Component struct UserCard {@Prop name:stringbuild(){Text(this.name)}}

如果参数会变化,可以用:

@Link 

@Observed 

坑 3:列表渲染性能问题

很多开发者第一次写列表会这样:

Column(){ForEach(this.list,(item)=>{Text(item.name)})}

如果列表很多:

  • UI 会卡顿
  • 滑动不流畅

因为 Column 会一次性渲染所有内容。正确做法:

使用 LazyForEach

List(){LazyForEach(this.list,(item)=>{ListItem(){Text(item.name)}})}

优势:

  • 按需渲染
  • 性能更好

坑 4:组件状态共享混乱

很多人一开始会滥用 @State,例如:

@State userInfo: User 

然后在多个组件之间传递,结果导致:

  • 状态同步混乱
  • UI 更新异常

正确做法是:使用 @Provide / @Consume,例如父组件:

@Provide userInfo: User ={ name:"Tom"}

子组件:

@Consume userInfo: User 

这样可以实现 跨组件状态共享

坑 5:生命周期理解错误

很多 Android / Flutter 开发者会寻找类似:

onCreate onResume 

这样的生命周期。ArkUI 其实提供了不同机制:

aboutToAppear(){console.log("页面即将出现")}aboutToDisappear(){console.log("页面消失")}

例如加载数据:

aboutToAppear(){this.loadData()}

坑 6:页面路由方式不同

很多开发者会寻找传统 Router,ArkUI 的导航方式是:

router.pushUrl() 

例如:

import router from'@ohos.router' router.pushUrl({ url:'pages/detail'})

返回:

router.back()

坑 7:UI 布局思维没转过来

很多 Android 开发者习惯:

LinearLayout RelativeLayout ConstraintLayout 

ArkUI 的布局更接近 Flexbox 思维,例如:

Row(){Text("Left")Blank()Text("Right")}

Blank() 相当于 flex spacer

坑 8:组件拆分不合理

很多人会写出一个 巨大的页面组件

struct HomePage {// 1000 行代码}

正确方式是 组件拆分

HomePage ├─ Banner ├─ UserInfo ├─ MenuGrid ├─ FeedList 

例如:

@Component struct Banner {build(){Text("Banner")}}

坑 9:动画系统不熟悉

ArkUI 内置动画非常简单:

.animateTo({ duration:300},()=>{this.scale =1.2})

例如点击放大:

Button("Click").onClick(()=>{animateTo({ duration:300},()=>{this.scale =1.2})})

坑 10:没有理解声明式 UI

这是 最核心的坑,很多开发者还在用 命令式思维

修改 UI 刷新 UI 重新渲染 UI 

而 ArkUI 的核心思想是:

UI = State

例如:

Text(this.isLogin ?"已登录":"未登录")

只需要改变状态:

this.isLogin =true

UI 会自动更新。

总结

写了一个月鸿蒙应用,我最大的感受是:ArkUI 的学习成本不在语法,而在思维。

你需要从:命令式 UI,转变为声明式 UI + 状态驱动 UI。理解这一点之后,很多问题都会迎刃而解。

如果你刚开始学习鸿蒙开发,建议重点理解三件事:

1️⃣ 状态管理
2️⃣ 声明式 UI 思维
3️⃣ 组件化设计

掌握这三点,ArkUI 会顺手很多。

Read more

Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石 前言 随着鸿蒙(OpenHarmony)生态向 PC 和平板端的高速扩张,如何为海量的三方软件建立一套标准化的“数字档案”,成了构建应用商店生态的核心痛点。过去,开发者提交应用信息时,往往采用碎片化的 JSON 或自定义文档。这会导致软件分发时详情页展示不一、多语言支持混乱,甚至连基本的截图和版本日志都难以对齐。 为了解决这个问题,我们需要引入一套具备全球化视野的元数据定义标准。appstream 作为 Linux 生态下最重要的应用信息描述规范,能够通过结构化的 XML 标签,精准定义软件的身世、功能和展示资产。适配到鸿蒙平台后,它不仅能让你的重型“鸿蒙私有应用商店”瞬间具备吞金般的解析能力,

By Ne0inhk
Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭轻量级服务器发送事件流、实现鸿蒙端长连接实时通讯与断线重连方案

Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭轻量级服务器发送事件流、实现鸿蒙端长连接实时通讯与断线重连方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭轻量级服务器发送事件流、实现鸿蒙端长连接实时通讯与断线重连方案 前言 在鸿蒙(OpenHarmony)生态的金融实时行情、在线社交协作以及物联网告警应用中,如何实现“数据从服务器到终端的实时推送”是一个核心命题。面对不需要双向通信(WebSocket 太重)且对功耗极其敏感的移动端场景,基于 HTTP 协议的轻量化长连接方案——SSE(Server-Sent Events)成为了事实上的行业标准。 然而,处理不稳定的移动网络波动、处理分块传输(Chunked Encoding)中的字节截断、以及在鸿蒙端实现优雅的断线重连逻辑,依然是开发者面临的技术瓶颈。 sse_stream 是一套专为解析该协议设计的高性能响应流解析引擎。它能将原始的二进制流瞬间转化为语义化的 Event 对象。适配到鸿蒙平台后,它不仅能支撑起一个毫秒级延迟的行情大盘,

By Ne0inhk
【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版

【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版

OpenClaw这是什么? OpenClaw(曾用名 Clawdbot / Moltbot)是一个开源的个人 AI 助手平台(GitHub 120k+ Stars),可以通过 WhatsApp、Telegram、Discord 等聊天软件与 AI 交互。简单说就是:在你自己的机器上运行一个 AI 助手,通过常用聊天软件跟它对话。 forks项目仓库 :https://github.com/MaoTouHU/OpenClawChinese 文章目录 * OpenClaw这是什么? * 汉化效果预览 * 环境要求 * 安装方式 * 方式 A:一键脚本(推荐新手) * 方式 B:npm 手动安装 * 方式 C:Docker 部署(服务器推荐) * 首次配置 * 运行初始化向导 * 安装守护进程(

By Ne0inhk
【Linux】Linux基本使用和程序部署

【Linux】Linux基本使用和程序部署

🎬 那我掉的头发算什么:个人主页 🔥 个人专栏: 《javaSE》《数据结构》《数据库》《javaEE》 ⛺️待到苦尽甘来日 文章目录 * Linux环境搭建 * 环境搭建方式 * 使用云服务器 * 使用终端软件连接到Linux * Linux常用命令 * ls * pwd * cd * touch * cat * mkdir * rm * cp * mv * tail * vim * grep * ps * netstat * 搭建java部署环境 * apt * JDK * MYSQL * 部署web项目到Linux * 什么是部署 * 环境配置 * 构建项目并打包 * 上传jar包运行程序 * 杀死进程 Linux环境搭建 环境搭建方式 主要有四种: 1. 直接安装在物理机上。但是 Linux 桌面使用起来非常不友好。所以不建议。【不推荐】。 2. 使用虚拟机软件,

By Ne0inhk