经验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'))  // 正确方式:加载资源而非硬编码
      
  • 注意事项
    • 所有界面文字(包括图片文字、音频字幕)都应避免硬编码(参考搜索结果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() 启动其他Ability
  • terminateSelf() 结束当前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)             // 绑定动态时间

🔗 模块调用关系

加载首页

数据绑定

工具调用

常量引用

备份数据

entryability

view

viewmodel

utils

common

entrybackupability

设计原则

  1. MVVM数据流:View层通过@State监听ViewModel变化,实现UI自动更新
  2. 模块隔离:业务逻辑(ViewModel)、工具(Utils)、UI(View)分层解耦
  3. 全局通信:使用AppStorage共享上下文,避免跨模块直接依赖
  4. 备份机制:通过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/awaitPromise),避免阻塞 build() 渲染,影响页面冷启动性能。例如:
    async aboutToAppear() {
      const data = await this.loadData(); // 异步加载数据
      this.dataList = data; // 更新状态变量
    }
    
  • 避免滥用
    • 不适用于频繁触发的逻辑(如 UI 交互),仅作一次性初始化。
    • aboutToAppear() 中修改 @Link 变量需谨慎,可能引发状态同步问题。
  • 性能优化:组件通过条件渲染(如 if 分支)删除时,会触发 aboutToDisappear(),但未渲染的组件可能强制触发 aboutToAppear() 以保证生命周期完整性(API12+ 规格)。
总结

aboutToAppear() 是组件生命周期的“入口点”,专注于初始化阶段的数据准备和状态设置。合理使用它能提升组件加载效率,但需结合异步处理和资源清理(在 aboutToDisappear() 中)以确保应用稳定性。如需页面级显示/隐藏逻辑,应优先使用 onPageShow()onPageHide()

经验5

在文件系统中,"../../" 是一个相对路径的表示方式,其含义如下:

路径解析说明

  1. ... 的含义

    • .(单点):表示当前目录(如 ./file.txt 表示当前目录下的 file.txt)。
    • ..(双点):表示上一级目录(如 ../file.txt 表示父目录下的 file.txt)。
  2. ../../ 的具体含义
    该路径表示:

    • 先返回当前目录的父目录(一级向上);
    • 再返回父目录的父目录(二级向上),即上两级目录
      示例:
      若当前路径为 /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编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销: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.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目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)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML图表

可以使用UML图表进行渲染,例如下面产生的一个序列图:

王五 李四 张三 王五 李四 张三 李四想了很长时间, 文字太长了 不适合放在一行. 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 打量着王五... 很好... 王五, 你怎么样?
  • 关于 UML图表 语法,参考 这儿,

流程图

链接

长方形

圆角长方形

菱形

  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart.js的流程图语法:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐