那 HarmonyOS PC 应用到底该怎么落代码?


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

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

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

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

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

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

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

文章目录

    • 引言
    • 第一件必须做的事:把“文档”提到页面之上
    • 第二件事:窗口不创建文档,只“获取”文档
      • 错误写法
      • 正确方式:文档由管理器统一提供
    • 第三件事:窗口生命周期 ≠ 文档生命周期
      • 正确的释放逻辑,只能存在于文档层
    • 多窗口同步,其实不需要“通信”
    • 保存,不再是行为,而是策略
    • HarmonyOS PC 为什么“逼你”这样写?
    • 一个判断你是否写对了的标准
    • 总结

引言

当你开始认真做 HarmonyOS PC 应用,很快会遇到一个绕不开的问题:

理念我懂了,
但代码到底该怎么写?

多窗口、长生命周期、进程常驻、文档并存——这些概念每一个都很“对”,但真正下手时,很多项目还是会不自觉地回到老路:

  • 页面里 load 数据
  • 页面关闭时 save
  • 每个窗口一套状态
  • 多窗口靠事件同步

结果就是:代码能跑,但结构已经开始崩。

问题并不在 HarmonyOS,而在于——你还在用“页面思维” 写 PC 应用。

第一件必须做的事:把“文档”提到页面之上

在 App 里,页面几乎就是一切。但在 PC 应用里,页面只是视图,文档才是主体。

如果你的文档还只是一个StringModel,藏在页面里,那你已经输了。

一个最小但正确的文档定义,应该像这样:

exportclassDocument{readonlyid:stringprivate_content:stringprivate_version=0constructor(id:string,content:string){this.id=idthis._content=content}getcontent(){returnthis._content}update(next:string){this._content=nextthis._version++this.notify()}onChange(cb:()=>void){// 订阅变更}privatenotify(){}}

注意几个关键点:

  • 文档有稳定的身份
  • 状态只允许通过方法修改
  • 页面不能直接控制字段

这一步的本质是:

切断页面对核心状态的控制权。

第二件事:窗口不创建文档,只“获取”文档

这是从页面思维切换过来时,最容易犯的错误

错误写法

@Entry@Componentstruct EditorWindow{@Statedoc=newDocument("a.txt",load("a.txt"))}

问题只有一个,但是致命的:

每个窗口一份文档实例。

多窗口一开,数据立刻分叉。

正确方式:文档由管理器统一提供

classDocumentManager{privatedocs=newMap<string,Document>()open(id:string):Document{if(!this.docs.has(id)){this.docs.set(id,newDocument(id,load(id)))}returnthis.docs.get(id)!}}

窗口里只做一件事:

@Entry@Componentstruct EditorWindow{doc:Document=docManager.open("a.txt")build(){EditorView({doc:this.doc})}}

一句话总结:

窗口只能“使用文档”,不能“拥有文档”。

第三件事:窗口生命周期 ≠ 文档生命周期

这是 PC 应用和移动 App 最本质的分界线。
在 HarmonyOS PC 上:

  • 窗口可以随时关闭
  • 应用进程可能继续存在
  • 文档可能被多个窗口同时引用

所以这类代码,本质上是错的:

aboutToDisappear(){save(this.doc)}

正确的释放逻辑,只能存在于文档层

classDocumentManager{privaterefs=newMap<string,number>()acquire(id:string):Document{this.refs.set(id,(this.refs.get(id)??0)+1)returnthis.open(id)}release(id:string){constcount=(this.refs.get(id)??1)-1if(count===0){this.saveAndDispose(id)}else{this.refs.set(id,count)}}}

窗口关闭时,只通知:

onWindowClose(){docManager.release(this.doc.id)}

这一步意味着:

保存行为,从页面钩子,升级为系统级策略。

多窗口同步,其实不需要“通信”

很多人一提多窗口,第一反应是:

怎么同步?
怎么发事件?

但在文档模型下,这个问题根本不存在。

doc.onChange(()=>{this.render()})

因为:

  • 所有窗口拿的是同一个 Document
  • 状态天然一致
  • 不存在“同步”的概念

你不是在同步数据,你只是在重新渲染同一个事实

保存,不再是行为,而是策略

页面思维下,常见纠结是:

  • 什么时候保存?
  • 切后台要不要保存?
  • 关闭窗口算不算一次保存?

文档思维下,这些问题直接换了一个维度:

classSavePolicy{autoSaveInterval=3s saveOnAllWindowsClosed=true}

页面对此一无所知。它只负责展示和编辑,不负责“人生大事”。

HarmonyOS PC 为什么“逼你”这样写?

因为它天然支持:

  • 多窗口
  • 多实例
  • 长生命周期进程

如果你还用页面思维:

系统能力越强,
你的结构越容易崩。

一个判断你是否写对了的标准

如果你的项目已经满足:

  • 页面里不再 load / save
  • 窗口关闭不影响文档存在
  • 多窗口不需要互相通信
  • 文档可以被多个视图同时引用

那基本可以确认一件事:

你已经在写真正的 PC 应用了。

总结

在 HarmonyOS PC 上,
页面只是壳,窗口只是入口,
文档,才是应用真正活着的东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1216126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机械臂路径规划】基于RRT算法规划一个6自由度路径,用于将SM-465变速箱的主轴从壳体中移出,同时避免与主箱体或已安装的副轴发生碰撞附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

基于51单片机的自动豆浆机系统 智能豆浆机

目录 系统概述硬件设计软件设计安全保护机制扩展功能 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于51单片机的自动豆浆机系统是一种智能化厨房设备&#xff0c;通过单片机控制实现豆浆制作全流程自动化。系统具备水位…

基于51单片机红外测温 非接触式红外测温仪 MLX90614 嵌入式系统

目录 MLX90614红外测温模块概述硬件连接与接口软件驱动实现温度数据处理校准与误差修正典型应用场景 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; MLX90614红外测温模块概述 MLX90614是一款非接触式红外测温传感器&#xff0c;由Me…

基于51单片机红外线感应自动门 液晶显示 自动 手动

目录 系统概述硬件组成功能实现核心代码片段注意事项 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于51单片机的红外线感应自动门系统结合了红外传感、液晶显示和自动/手动控制功能。该系统通过红外传感器检测人体信号&…

01.Nginx简介

01.Nginx简介01.Nginx简介 01.1 背景介绍———————————————————————————————————————————————————————————————————————————无敌小马爱学习…

计算机想学习某个方向,怎么知道学习路线

前言 最近很多初学计算机的同学&#xff0c;一直在问&#xff0c;说“甘哥&#xff0c;我对XXX方向比较感兴趣。现在我应该怎么规划&#xff0c;毕业的时候才能找到这个方向的好的公司的岗位呢” 针对同学的疑惑&#xff0c;阿甘总结下来&#xff0c;其实主要分为两类&#xff…

如何通过提示词减少AICG费片的痛点

在 AIGC 视频&#xff08;如 Sora, Runway, Pika, Kling 等&#xff09;领域&#xff0c;“费片率”&#xff08;Wasted Footage Rate&#xff09;是最大的痛点。 针对 视频 CG 生成&#xff0c;原本的通用文本“五维量规”需要进行深度的领域化改造。我们不再关注“回答是否礼…

基于SpringBoot的社区老人健康信息管理系统毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于SpringBoot框架的社区老人健康信息管理系统。该系统旨在通过整合现代信息技术与社区养老服务&#xff0c;提高社区老人健康管理…

从玄学到工程:解构AI Agent开发的“铁三角”法则(分工/方法论/预算)

AI的“涌现”既是惊喜也是惊吓&#xff0c;微小的扰动都可能引发崩坏。驾驭它的关键在于建立“协作框架”&#xff1a;用【分工】隔离职责&#xff0c;用【方法论】固化思考路径&#xff0c;用【预算】设定止损边界。别让AI在“裸奔”中失控&#xff0c;要用工程化的铁律&#…

基于SpringBoot的车辆违章信息管理系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于SpringBoot框架的车辆违章信息管理系统&#xff0c;以满足现代交通管理对于高效、便捷、智能化的需求。具体研究目的如下&…

基于SpringBoot的高校就业招聘系统毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在构建一个基于SpringBoot的高校就业招聘系统&#xff0c;以满足当前高校就业市场的需求&#xff0c;提升高校就业服务的质量和效率。具体研究目的如…

基于SpringBoot的宠物健康顾问系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在开发一套基于SpringBoot框架的宠物健康顾问系统&#xff0c;以实现对宠物健康问题的智能诊断与建议。具体研究目的如下&#xff1a; 构建一个功能…

LLM 裁判(LLM-as-a-judge)

LLM 裁判&#xff08;LLM-as-a-judge&#xff09; 是指利用强大的大语言模型&#xff08;如 GPT-4, Claude 3.5, Gemini 1.5 Pro 等&#xff09;作为“考官”&#xff0c;去评估其他模型生成的回复质量。 所谓的 “五维评分量规” 并没有一个绝对统一的国际标准&#xff0c;但在…

基于SpringBoot的扶贫助农系统毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于SpringBoot框架的扶贫助农系统&#xff0c;以解决我国农村地区扶贫工作面临的实际问题。具体研究目的如下&#xff1a; 首先&a…

简洁深刻古典诗歌欣赏:孤舟系古树,不见渡人来

八十五野渡 孤舟系古树&#xff0c;不见渡人来。 唯有双凫影&#xff0c;时从水底开。 八十六早行 露重鞋帮湿&#xff0c;天低月尚悬。 忽闻山后语&#xff0c;挑担卖笋人。 八十七题竹 风吹千叶响&#xff0c;影扫一阶苔。 不为清虚意&#xff0c;何曾长此来…

探索生命:意识是如何产生的

意识这个词&#xff0c;是一个让人魂牵梦绕的词。几千年来都是&#xff0c;没有一个人能确切地说清楚它。对于意识&#xff0c;我有自己的定义。 意识的定义&#xff1a;意识是高级生命体的大脑对于客观世界的反应。想象&#xff0c;智慧&#xff0c;思维&#xff0c;知觉&…

关于火的古典诗歌:扑火非是愚昧行,追求光明是本心

卷四 火部&#xff08;二十首&#xff09; 1. 燧人氏 钻木取星火&#xff0c;光明出燧巢。 焚荒开沃野&#xff0c;煮海化佳肴。 夜破妖魔遁&#xff0c;文明由此交。 至今炊烟起&#xff0c;犹念圣功昭。 2. 观焊工 电弧光裂夜幕开&#xff0c;铁水金花溅玉台。…

为本地部署的大模型添加API Key认证:Nginx实现方案

在使用 LangChain 开发大模型应用时,我们经常会遇到这样的场景:使用在线模型(如 OpenAI、通义千问等)时,自带 API Key 认证机制 本地部署的 Ollama、vLLM 等模型服务,默认没有任何认证在本地或局域网环境下问题还…

几个很实用但是又比较冷门的 Web API 极其极简演示

目录前言第一个 全屏(Fullscreen API)第二个 剪切板 (Clipboard Async API)第三个,监听元素变化(Resize Observer API)第四个,广播频道(Broadcast Channel API)第五个,性能(Performance Interface API)第…

Java毕设项目推荐-基于springboot的农业公司农场信息管理平台设计与开发【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…