鸿蒙开发笔记
是组件生命周期的“入口点”,专注于初始化阶段的数据准备和状态设置。合理使用它能提升组件加载效率,但需结合异步处理和资源清理(在中)以确保应用稳定性。如需页面级显示/隐藏逻辑,应优先使用和。经验5在文件系统中,"../../"是一个相对路径路径解析说明和..的含义(单点):表示当前目录(如./file.txt表示当前目录下的file.txt..(双点):表示上一级目录(如表示父目录下的file.tx
经验1-反单引号
经验2-字符串资源
在鸿蒙(HarmonyOS)应用开发中,直接硬编码字符串(如直接在代码中写“首页”)虽然简单,但会导致严重问题。以下是详细分析,结合开发规范和实际场景,解释为何应通过资源文件加载字符串,而非直接硬编码:
1. 硬编码的核心问题
- 本地化困难:直接硬编码字符串(如
"首页")会使应用无法支持多语言。当需要翻译成其他语言(如英语"Home"或日语"ホーム")时,必须手动修改代码中的每个字符串,增加维护成本且易出错。 - 拼接错误风险:如果字符串由多个片段拼接(如
"欢迎来到" + "首页"),翻译时可能破坏句子完整性。例如,英语语序可能需调整为"Home Page",但硬编码拼接会导致大小写或语义混乱(如搜索结果1中的案例:"Rain tomorrow"和"Bring an umbrella"拼接后出现语法错误)。 - 违反开发规范:鸿蒙开发强调可维护性和国际化,硬编码不符合资源与代码分离的最佳实践(参考搜索结果1),可能导致应用审核失败或性能问题。
2. 通过资源加载的优势
- 统一管理:将字符串提取到资源文件(如
string.json),开发者只需维护一个文件,无需修改代码即可支持多语言。例如:- 在资源文件中定义:
{ "name": "home_page", "value": "首页" }
- 在资源文件中定义:
- 动态更新:资源文件支持运行时加载,便于动态切换语言或主题。例如,使用
@kit.I18n模块加载字符串:import { I18n } from '@kit.I18n'; let homeText = I18n.getI18nInstance().getString($r('app.string.home_page')); - 避免占位符问题:对于含变量的字符串(如“打开{appName}”),资源文件支持占位符(如
%s),确保翻译完整性:// string.json { "name": "open_app", "value": "打开%s" // 占位符设计,避免拼接错误 }
3. 实际开发建议
- 替代硬编码的方案:
- 使用HarmonyOS的资源管理机制(如
$r('app.string.xxx')加载字符串资源)。 - 在UI组件中直接引用资源ID,例如:
Text($r('app.string.home_page')) // 正确方式:加载资源而非硬编码
- 使用HarmonyOS的资源管理机制(如
- 注意事项:
- 所有界面文字(包括图片文字、音频字幕)都应避免硬编码(参考搜索结果1的约束)。
- 在涉及动态内容(如用户输入或网络数据)时,优先使用资源占位符而非字符串拼接。
总结
直接硬编码字符串(如“首页”)虽然编码快捷,但会破坏应用的可维护性、国际化支持,并增加错误风险。相反,通过资源文件加载字符串,能提升开发效率、确保多语言兼容性,并符合鸿蒙开发规范。推荐在项目中统一使用资源管理机制,以构建更健壮的HarmonyOS应用。
内容由AI生成,仅供参考


经验3
entry/src/main/ets/common、entryability、entrybackupability、utils、view、view model解释这几个文件
以下为鸿蒙应用开发的完整模块化设计指南,整合了各模块的核心功能、具体用法和交互关系:
📁 1. common(公共模块)
功能:全局资源管理与样式复用
具体用法:
// 常量定义(ColorConstants.ets)
export const PrimaryColor = '#007AFF'; // 全局主色
export const DangerColor = '#FF3B30'; // 警示色
// 样式工具(StyleUtils.ets)
export function textStyle(size: number, weight: number) {
return { fontSize: size, fontWeight: weight }; // 返回文本样式对象
}
使用场景:
import { PrimaryColor, textStyle } from '../common/StyleUtils';
Text('Hello World')
.fontColor(PrimaryColor) // 使用全局颜色
.style(textStyle(16, 500)) // 应用复用样式
⚙️ 2. entryability(主入口能力)
功能:应用启动与上下文管理
具体用法:
// 设置启动页
onWindowStageCreate(windowStage: window.WindowStage): void {
windowStage.loadContent('pages/Index', (err) => {
if (err) console.error('加载页面失败');
});
}
// 获取上下文
onCreate(want: Want): void {
const context = this.context;
AppStorage.setOrCreate('abilityContext', context); // 存储至全局
}
关键能力:
startAbility()启动其他AbilityterminateSelf()结束当前Ability
🔄 3. entrybackupability(备份能力)
功能:数据云备份与恢复
具体用法:
// 实现备份回调
onBackup(): void {
const data = AppStorage.get('userData'); // 获取待备份数据
// 序列化到云存储
}
onRestore(backupData: any): void {
AppStorage.setOrCreate('userData', backupData); // 恢复数据
}
触发场景:设备迁移时自动执行云备份/恢复
🧰 4. utils(工具模块)
功能:封装通用工具函数
具体用法:
// 文件操作(FileUtils.ets)
import fs from '@kit.FileManagementKit';
export function readFile(path: string): string {
return fs.readTextSync(path); // 同步读取文本
}
// 数据处理(DateUtils.ets)
export function formatDate(date: Date): string {
return `${date.getFullYear()}-${date.getMonth()+1}`; // 简化日期格式
}
调用示例:
import { formatDate } from '../utils/DateUtils';
Text(formatDate(new Date())) // 显示"2026-1"
🖼️ 5. view(视图层)
功能:UI构建与组件封装
具体用法:
// 页面组件(Index.ets)
@Entry
@Component
struct Index {
@State count: number = 0; // 响应式状态
build() {
Column() {
Button('点击+1').onClick(() => { this.count++ })
Text(`计数: ${this.count}`) // 自动更新
}
}
}
// 自定义组件(CustomButton.ets)
@Component
export struct CustomButton {
label: string = '按钮';
onClick: () => void;
build() {
Button(this.label).onClick(() => this.onClick())
}
}
🧠 6. viewmodel(视图模型层)
功能:状态管理与业务逻辑
具体用法:
// 状态管理(ClockViewModel.ets)
export class ClockViewModel {
@State time: string = '';
startTimer() {
setInterval(() => {
this.time = new Date().toLocaleTimeString(); // 每秒更新
}, 1000);
}
}
// 业务逻辑(BookUtils.ets)
import { DocumentViewPicker } from '@kit.FilePickerKit';
export function importBook() {
const picker = new DocumentViewPicker();
picker.select().then(file => { // 文件选择
// 处理导入逻辑
});
}
与View交互:
const vm = new ClockViewModel();
vm.startTimer(); // 启动定时器
Text(vm.time) // 绑定动态时间
🔗 模块调用关系
设计原则
- MVVM数据流:View层通过
@State监听ViewModel变化,实现UI自动更新- 模块隔离:业务逻辑(ViewModel)、工具(Utils)、UI(View)分层解耦
- 全局通信:使用
AppStorage共享上下文,避免跨模块直接依赖- 备份机制:通过entrybackupability实现无感数据迁移,提升用户体验
此设计符合鸿蒙官方推荐架构,已在18大行业应用验证(参考《鸿蒙应用开发常见问题手册》),可有效解决页面跳转错误、数据同步失效等高频问题。
内容由AI生成,仅供参考
经验4
aboutToAppear() 生命周期详解
在鸿蒙(HarmonyOS)的 ArkUI 声明式开发范式中,aboutToAppear() 是自定义组件的核心生命周期函数之一。它用于在组件初始化阶段执行关键操作,例如数据加载或状态设置。以下是对其详细解释,基于鸿蒙官方规范和最佳实践:
1. 触发时机与定义
aboutToAppear()在自定义组件(通过@Component装饰)的新实例创建后立即执行,发生在build()函数之前 123。- 此时组件尚未渲染到界面,但已初始化成员变量(例如通过本地默认值或构造函数参数)。
- 示例流程:当组件首次加载或重建时,执行顺序为:
- 成员变量初始化 →
aboutToAppear()→build()→ 子组件渲染。
- 成员变量初始化 →
2. 主要功能与用途
- 初始化数据:适合执行数据获取逻辑,如从网络、本地存储加载数据。
- 修改状态变量:允许在函数内更改
@State、@Prop等状态变量,这些变更会在后续build()中生效,驱动 UI 更新。 - 资源注册:可绑定事件监听器或订阅外部服务(如媒体查询),但需在
aboutToDisappear()中清理以避免内存泄漏。
例如,在媒体查询场景中绑定回调:
aboutToAppear() {
this.listener.on('change', (mediaQueryResult) => {
// 处理横竖屏切换逻辑
});
}
aboutToDisappear() {
this.listener.off('change'); // 清理注册
}
3. 与相关生命周期的区别
- vs
onPageShow():aboutToAppear()适用于所有@Component组件(包括子组件),而onPageShow()仅限@Entry装饰的页面级组件12。- 页面首次加载时,执行顺序为:
aboutToAppear()→build()→onPageShow();页面返回时,仅触发onPageShow(),而aboutToAppear()不会重复执行。
- vs
aboutToDisappear():aboutToDisappear()在组件销毁前调用,用于清理资源(如定时器、订阅),两者需成对使用以确保资源安全释放。
4. 最佳实践与注意事项
- 异步操作:若涉及耗时任务(如网络请求),必须使用异步方式(
async/await或Promise),避免阻塞build()渲染,影响页面冷启动性能。例如:async aboutToAppear() { const data = await this.loadData(); // 异步加载数据 this.dataList = data; // 更新状态变量 } - 避免滥用:
- 不适用于频繁触发的逻辑(如 UI 交互),仅作一次性初始化。
- 在
aboutToAppear()中修改@Link变量需谨慎,可能引发状态同步问题。
- 性能优化:组件通过条件渲染(如
if分支)删除时,会触发aboutToDisappear(),但未渲染的组件可能强制触发aboutToAppear()以保证生命周期完整性(API12+ 规格)。
总结
aboutToAppear() 是组件生命周期的“入口点”,专注于初始化阶段的数据准备和状态设置。合理使用它能提升组件加载效率,但需结合异步处理和资源清理(在 aboutToDisappear() 中)以确保应用稳定性。如需页面级显示/隐藏逻辑,应优先使用 onPageShow() 和 onPageHide()。
经验5
在文件系统中,"../../" 是一个相对路径的表示方式,其含义如下:
路径解析说明
-
.和..的含义.(单点):表示当前目录(如./file.txt表示当前目录下的file.txt)。..(双点):表示上一级目录(如../file.txt表示父目录下的file.txt)。
-
../../的具体含义
该路径表示:- 先返回当前目录的父目录(一级向上);
- 再返回父目录的父目录(二级向上),即上两级目录。
示例:
若当前路径为/a/b/c/,则../../对应/a/目录。
在鸿蒙(HarmonyOS)中的注意事项
- 应用沙箱路径:
在鸿蒙开发中,应用的文件操作通常基于沙箱路径(如context.cacheDir获取缓存路径)。使用../../需注意当前工作目录的基准位置,避免越权访问沙箱外的文件。 - 路径协议规范:
鸿蒙支持多种路径协议(如fd://标识媒体句柄、internal://表示私有目录)。直接使用../../属于相对路径操作,需确保目标路径在应用沙箱内合法。
使用场景示例
假设需要读取上两级目录的配置文件:
// 伪代码示例:基于当前目录向上回溯两级
import fs from '@kit.FileKit';
// 获取当前工作目录(假设为 /app/com.example/foo/bar/)
const currentDir = ...;
const targetDir = currentDir + '../../'; // 目标路径:/app/com.example/foo/
const configFile = targetDir + 'config.json';
// 读取文件
fs.readTextSync(configFile);
⚠️ 安全提示:
在鸿蒙中频繁使用../../可能引发路径越界风险,建议优先使用绝对路径(如context.filesDir)或内部协议路径(如internal://cache)。
内容由AI生成,仅供参考
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
| 项目 | Value |
|---|---|
| 电脑 | $1600 |
| 手机 | $12 |
| 导管 | $1 |
设定内容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
| 第一列 | 第二列 | 第三列 |
|---|---|---|
| 第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:
| 原始符号 | 转换后 | 说明 |
|---|---|---|
"引号" |
“引号” | 直引号变弯引号 |
'单引号' |
‘单引号’ | 直单引号变弯单引号 |
-- |
– | 两个连字符变短破折号 |
--- |
— | 三个连字符变长破折号 |
... |
… | 三个点变省略号 |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML图表
可以使用UML图表进行渲染,例如下面产生的一个序列图:
- 关于 UML图表 语法,参考 这儿,
流程图
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart.js的流程图语法:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
-
注脚的解释 ↩︎
更多推荐



所有评论(0)