news 2026/8/20 10:02:45

HarmonyOS 和 React 对比-Day22

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 和 React 对比-Day22

适用人群:有 React/Vue/TS 基础的前端开发者
核心策略:用前端知识做类比,只记差异点和考试陷阱

第 1 部分:概念快速映射(5 分钟)

把鸿蒙概念映射到你熟悉的前端概念上,大幅降低记忆成本:

鸿蒙前端类比一句话说明
ArkTSTypeScript + 装饰器语法糖就是 TS,多了@State/@Prop等装饰器
ArkUI声明式 UI(类似 React/Vue3)用函数/组件描述 UI,状态驱动视图
@Entryexport default/ 页面入口一个页面只能有一个,标记页面入口
@Componentfunction Component()/ 自定义组件普通组件装饰器,没有页面生命周期
@StateuseState组件内部状态,必须给初始值
@Propprops(单向数据流)父传子,子组件只读
@Linkv-model/ 双向绑定父子双向同步
@Provide/@ConsumeReact Context / Provide/Inject跨层级共享数据,不用逐层传
@Builder抽离 UI 函数 / Render Prop复用 UI 结构,不是组件
UIAbility类似 Android Activity / 小程序 Page应用的基本组成单元,管理生命周期
routerreact-router/vue-router页面跳转,有pushUrlreplaceUrl
HAP.apk/ 小程序包鸿蒙应用打包单元
DevEco StudioVS Code + 专属插件IDE,有预览器、模拟器、真机调试

第 2 部分:高频考点速记(15 分钟)

一、判断题 · 生死线(记牢这些"陷阱")

题目表述答案前端类比 / 记忆口诀
@Component组件支持onPageShow/onBackPress只有@Entry页面才有页面生命周期,普通组件没有
@Entry页面可以有多个一个页面只能一个@Entry,就像export default只能有一个
@State变量可以不给初始值相当于useState()不给初始值,必须给
首选项 Preferences 的 Key 可以重复Key 唯一,最大长度80 字节
router.pushUrl()页面栈最大 32 层记住数字32
使用 http 请求必须订阅headersReceive才成功不是必须的,正常发请求就行
Web 组件对所有网页都可以用zoom()有限制,不是全部
预览器可以预览网络、数据库、传感器这些必须用模拟器或真机,预览器只能看 UI
应用由一个或多个 HAP 组成HAP 是基本单元
每一个自定义组件都有自己的生命周期组件级生命周期独立存在
本地模拟器可以在虚拟机内运行节省资源需要一定硬件资源

二、单选题 · 送分题(秒选)

考点答案前端记忆法
页面入口装饰器@Entry=export default
自定义组件装饰器@Component=function Component()
自定义弹窗装饰器@CustomDialog弹窗专用
路由模块导入import router from '@ohos.router'类似import { useRouter }
跳转并销毁当前页router.replaceUrl()=router.replace()
跳转并保留当前页(压栈)router.pushUrl()=router.push(),最大 32 层
页面路径配置文件main_pages.json=routes.ts
模块配置文件module.json5模块级配置
应用全局配置文件app.json5=package.json
胶囊型按钮ButtonType.Capsule样式枚举
网络图片权限ohos.permission.INTERNET类似android.permission.INTERNET
首选项 Key 最大长度80 字节死记
不能包含子组件的组件LoadingProgress纯展示组件,类似<img>不能嵌套
List 滑动偏移量事件onScroll滚动监听
Video 播放网络视频权限ohos.permission.INTERNET同网络请求
Video 获取视频时长的事件onPrepared不是onStart
bundleName作用标识应用唯一性=package.name
UIAbility 默认启动模式standard不是 singleton(单例是另外配的)
发起网络请求导入模块import http from '@ohos.net.http'标准库
提交表单数据请求方式RequestMethod.POST常规
常量命名规范全大写下划线MAX_COUNT
类名命名规范大驼峰MyClass
变量命名规范小驼峰myVariable

三、多选题 · 重灾区(最容易丢分)

考点正确答案避坑指南
可滚动的容器组件ScrollListGridRowColumn默认不可滚动!这是最大陷阱
UIAbility 生命周期onCreateonDestroyonForegroundonBackground不含onPageShow/onPageHide,那是页面生命周期
页面生命周期@Entry组件)onPageShowonPageHideonBackPress和 UIAbility 生命周期分开记
module.json5 包含的信息Ability 配置、设备类型、权限列表不含应用包名和版本号(在app.json5
ArkTS 声明式开发基本组成装饰器、自定义组件、UI 描述、内置组件、属性方法、事件方法全选,送分题
正确的组件层次Text > SpanButton > Column > ImageImage不能包含子组件
ForEach 参数数组、lambda 生成子组件、唯一键值生成函数类似array.map((item, index) => ...)
文本组件属性fontColorfontSizefontStylefontWeightfontFamily全选
Tabs 与 TabContentTabContent 宽 = Tabs 的 barWidth、tabBar 支持@Builder、一个 TabsController 不能控制多个 Tabs注意细节描述
响应式布局断点xssmmdlgxlxxl全选,6 个都要记
Promise 特点支持链式调用、状态一旦完成不可变不支持同步操作不能暂停
代码自动生成快速重写父类、生成构造器、生成 getter、生成 setter全选
数据管理方式分布式键值数据库、分布式数据对象、用户首选项、关系型数据库全选
自由流转体验媒体播控、应用接续、跨设备拖拽、跨设备剪贴板、服务互通全选

第 3 部分:配置文件与生命周期(5 分钟)

三个核心配置文件

// 1. app.json5 —— 应用全局配置(= package.json){"app":{"bundleName":"com.example.myapp",// 唯一标识,类似 package.name"versionCode":1,"versionName":"1.0.0"}}// 2. module.json5 —— 模块配置(= vite.config / 模块级配置){"module":{"name":"entry","type":"entry","abilities":[...],// Ability 列表"deviceTypes":[...],// 支持的设备类型"requestPermissions":[...]// 权限申请列表}}// 3. main_pages.json —— 页面路由配置(= routes.ts){"src":["pages/Index","pages/Detail"]}

生命周期对比(考试必考)

UIAbility 生命周期(应用级) 页面生命周期(@Entry 组件级) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ onCreate() ← 实例创建 onPageShow() ← 页面显示 onDestroy() ← 实例销毁 onPageHide() ← 页面隐藏 onForeground() ← 进入前台 onBackPress() ← 返回键 onBackground() ← 进入后台

核心区别:UIAbility 是"应用进程级",页面生命周期是"页面级"。多选题经常混着考,必须分开记。

启动模式

模式说明类比
standard每次启动新建实例(默认)= 普通页面跳转
singleton单实例,已存在就复用= 单例模式
specified按指定 Key 匹配实例= 带 ID 的页面复用

第 4 部分:前端开发者易错点(5 分钟)

1. 布局思维转换

  • 前端:display: flex+flex-direction
  • 鸿蒙:直接Row()(横向 Flex)或Column()(纵向 Flex),没有display属性
  • Row/Column默认不可滚动,需要滚动必须包一层Scroll或用List

2. 状态管理差异

// 前端 Reactconst[count,setCount]=useState(0);// 鸿蒙 ArkTS@Statecount:number=0;// 必须给初始值!必须声明类型!// 直接 this.count++ 即可,不需要 setState

3. 路由跳转差异

// 前端:router.push('/detail')// 鸿蒙:router.pushUrl({url:'pages/Detail'});// 压栈,保留当前页router.replaceUrl({url:'pages/Detail'});// 替换,销毁当前页router.back();// 返回

4. 网络请求

importhttpfrom'@ohos.net.http';// 模块名是 @ohos.net.http,不是 axios// 必须先在 module.json5 申请 ohos.permission.INTERNET 权限

5. 子组件限制

  • ImageLoadingProgressText(不含 Span 时)不能包含子组件
  • 类似前端的<img><input>不能嵌套子元素

第 5 部分:考前 2 分钟 · 口诀速记

生命周期口诀
“Ability 四兄弟:CreateDestroyForegroundBackground
页面三剑客:ShowHideBackPress。”

多选题防坑口诀
“滚动只有Scroll/List/GridRow/Column不滚动;
module.json5管模块,app.json5管全局;
@Component没页面命,@Entry才有onPageShow。”

判断题防坑口诀
“Key 唯一 80 字节,32 层栈要牢记;
预览器不看网络库,模拟器真机才靠谱;
replaceUrl销毁页,pushUrl压栈留后路。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 9:56:12

Stripe 70亿美元收购OpenRouter:AI模型调用与计费基础设施的价值解析

上周&#xff0c;当 Stripe 以超过 70 亿美元的价格敲定对 AI 初创公司 OpenRouter 的收购时&#xff0c;很多人的第一反应是&#xff1a;一家支付巨头&#xff0c;为什么要花这么大价钱买一个“AI 模型聚合器”&#xff1f;这看起来像是一个简单的“支付AI”的故事&#xff0c…

作者头像 李华
网站建设 2026/8/20 9:54:44

Ryzen处理器降压调优实战:SMUDebugTool完整上手指南

Ryzen处理器降压调优实战&#xff1a;SMUDebugTool完整上手指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…

作者头像 李华
网站建设 2026/8/20 9:52:08

多智能体强化学习:编码校正双深度Q网络原理与工程实践

1. 项目概述&#xff1a;当多智能体遇上编码校正双深度Q网络 在工业自动化、机器人集群协同、智能交通调度这些领域&#xff0c;我们常常面对的不是一个孤立的决策单元&#xff0c;而是一群相互影响、需要协作或竞争的智能体。传统的单智能体强化学习模型直接套用过来&#xff…

作者头像 李华
网站建设 2026/8/20 9:50:09

NCM文件解密转MP3:免费开源的ncmdump,新手几分钟就能上手

NCM文件解密转MP3&#xff1a;免费开源的ncmdump&#xff0c;新手几分钟就能上手 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 车载音响又拒播U盘里那首歌了&#xff0c;屏幕只留一行"格式不支持"。歌没坏&#xff0c;它…

作者头像 李华