详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第六节(js版) ——模块化设计实现复杂页面

news2024/11/26 13:49:35

        

        随着HarmonyOS生态的日渐完善,越来越多的厂商加入鸿蒙系统应用开发的行列。然而从其他系统转到鸿蒙开发,很多开发者还是需要一个适应的过程,特别是面对比较复杂的页面,应该如何合理进行模块化拆分是一个难点。

        本文将通过一个实例,来分析如果采用模块化的方式实现一个包含丰富内容和交互的复杂页面。

一、复杂页面的痛点

        随着智能设备性能的不断提升,我们开发的App页面也日益复杂,包含更多的功能模块和交互需求。直接在一个页面文件中开发所有功能,很容易造成以下问题:

  • 代码量庞大,一个文件上千行代码,极其不利于后续维护
  • 各模块功能高度耦合,测试和迭代非常不方便
  • UI和交互修改会影响到多个模块,冲突概率大

所以我们迫切需要采用模块化的方式来开发复杂页面。

二、页面模块化拆分


1. 复杂页面概览


        我们假设需要开发一个旅游摄影社区的 App,其中有一个发帖页面,包含选择图片、拍摄图片、输入标题和正文、添加地点等多个组件,同时页面交互也非常复杂。

先来看下简单的页面结构,页面可以明显划分为多个功能模块:

  1. 标题输入模块
  2. 内容输入模块
  3. 图片模块
    1. 图片列表
    2. 拍照或从相册选择
  4. 地点模块
  5. 提交按钮

这已经是一个比较复杂的页面了,如果全部写在一个 .hml 文件中,会非常难以维护。

所以我们需要进行模块化拆分。

2.模块化拆分实现


鸿蒙提供了 <import> <include> 标签来进行模块化:

比如我们创建 title-input.hmlcontent-input.hml等组件文件,然后在页面中导入:

<!-- index.hml -->

<div class="page">
  <import src="title-input.hml" />
  <import src="content-input.hml" />

  <image src=""></image>
  
  <text class="location"></text>

  <button type="primary">发布</button>

</div>

这样就实现了模块的解耦。

3. 小组件之间的数据交互

视图拆分完成后,我们还需要thinking数据交互问题。这就需要用到观察者模式

在JS Ability中我们可以定义观察方法,小组件可以调用这些方法主动通知 Ability 数据变化,完成跨组件的数据流转,比如:

// index.js
export default {
  data: {
   title: ""  
  },
  
  updateTitle(newTitle) {
    this.title = newTitle;
  }  
}

// title-input.js
import ability from "../index.js";

function onTitleChange(newTitle) {
  ability.updateTitle(newTitle); 
}

        这样title-input组件就可以通过updateTitle方法来改变index页面的数据。       

        标题和内容输入组件可以在输入时主动调用这些方法更新ability中保存的数据,这样就实现了跨组件通信。

        页面提交按钮的点击事件,也可以直接获取ability上已经更新过的最新数据后处理。

        通过以上方法,我们实现了页面的模块化拆分,并处理了组件之间的数据交互问题。这样代码结构清晰,可维护性也大幅提高。

三、页面数据管理

复杂页面中,不同模块都可能改变ABILITY中的数据。为了规范数据流向,我们通常会设置一些数据管理规则:

  1. 所有页面数据只能通过Ability管理,不能由单个组件自己保存
  2. 数据更新必须通过Ability暴露出来的方法,不能私自修改其它数据
  3. 对于不确定的中间状态数据,应封装为JS函数内部变量,不暴露到ABILITY中

按照这些原则,可以保证数据流向清晰,修改 predictable。

四、总结

        模块化设计是开发复杂页面的关键。本文通过一个实例,介绍了如何利用鸿蒙的import/include以及观察者模式实现模块化拆分,并处理好组件间的数据交互问题。

        模块化开发能大幅提高代码质量,如果你在鸿蒙应用开发过程中也遇到类似复杂页面的困扰,不妨借鉴本文的解决方案。

欢迎大家在评论区分享你的模块化设计经验!

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

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

相关文章

redis各种数据类型的应用场景

String应用场景 单值缓存 SET key value GET key 对象缓存 SET user:1 value(json格式数据)MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance 分布式锁 SETNX product:10001 true //返回1代表获取锁成功 …

7天速成Python——第三天

[7天速成Python——第三天] 3 数据类型 布尔值&#xff08;bool&#xff09;&#xff1a;True False整型&#xff08;int&#xff09; &#xff1a;1 19 22 300字符串&#xff08;str&#xff09; &#xff1a;"中国联通" upper/lower/isdecimal/strip/lstrip/r…

Postman使用总结--关联

当接口和接口之间&#xff0c;有依赖关系时&#xff0c;需要借助 postman 关联技术来实现

【算法与数据结构】LeetCode55、45、跳跃游戏 I 、II

文章目录 一、跳跃游戏I二、跳跃游戏II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、跳跃游戏I 思路分析&#xff1a;本题目标是根据跳跃数组的元素&#xff0c;判断最终能够到达数组末端。我们引入了一个跳跃范围…

后端低代码平台探索总结

业务需求快速变化的背景 我们在对业务需求进行梳理后&#xff0c;在进行程序设计时&#xff0c;对于将来可能发生变化的常量、变量、阀值、开关、条件、公式等等&#xff0c;可能会配置在环境变量或数字字典来支持可配置。但是需求变化往往会更加复杂、更加不可预测&#xff0…

Java中Exception的使用方法

Exception介绍异常处理机制的优缺点常见的Exception异常处理的常见错误优雅的处理异常异常处理中存在的性能问题Java自定义异常示例 Exception介绍 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是一种特殊类型的对象&#xff0c;表示程序运行过程中发生的意外或…

智慧养老:创新科技让老年生活更美好

智慧养老&#xff1a;创新科技让老年生活更美好 随着人口老龄化的加剧&#xff0c;智慧养老成为了关注焦点。智慧养老以创新科技为核心&#xff0c;旨在改善老年人的生活品质、促进健康、增强安全感和社会融入感。本文将详细介绍智慧养老的关键技术和应用场景&#xff0c;带您了…

iPhone16:首款AI iPhone?

随着科技水平的不断发展&#xff0c;智能手机逐渐成为人们最依赖的电子产品之一。为能够满足用户需求&#xff0c;手机的硬件、外观设计与性能飞速提升&#xff0c;这也导致智能手机市场快速进入到瓶颈期。 为了能够带来更优秀的表现&#xff0c;苹果可能会为iPhone 16系列带来…

黑马React:基础拓展

黑马React: D10-基础拓展 Date: December 18, 2023 useReducer 基础使用 作用: 让 React 管理多个相对关联的状态数据 补充&#xff1a;和useState的作用类似&#xff0c;用来管理相对复杂的状态数据 **特点&#xff1a;**useReducer返回值为一个数组, 可以解构处数值stat…

【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

论文标题&#xff1a;Open X-Embodiment: Robotic Learning Datasets and RT-X Models 论文作者&#xff1a;– 论文原文&#xff1a;https://arxiv.org/abs/2310.08864 论文出处&#xff1a;– 论文被引&#xff1a;–&#xff08;12/18/2023&#xff09; 论文代码&#xff1a…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记&#xff1a;【二叉树篇】合并二叉树 日期&#xff1a;2023.12.18 参考&#xff1a;代码随想录、力扣 617. 合并二叉树 题目描述 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xf…

公共字段自动填充——后端

场景&#xff1a;当处理一些请求时&#xff0c;会重复的对数据库的某些字段进行赋值&#xff08;如&#xff1a;在插入和更新某个物品时&#xff0c;需要更新该物品的更新时间和更新者的信息&#xff09;&#xff0c;这样会导致代码冗余。 如&#xff1a; 思路&#xff1a; 自…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的&#xff0c;可是在玩过了它本体自带的东风系列战役后&#xff0c;在最精髓的最后一关——game over这个关卡&#xff0c;却有个非常头疼的问题。 逃跑其实是非常简单的&#xff0c;但是想要无伤环游全岛确十分困难&#xff0c;因为这关卡…

探索人工智能中的语言模型:原理、应用与未来发展

导言 语言模型在人工智能领域中扮演着重要的角色&#xff0c;它不仅是自然语言处理的基础&#xff0c;也是许多智能系统的核心。本文将深入研究语言模型的原理、广泛应用以及未来发展趋势。 1. 语言模型的原理 统计语言模型&#xff1a; 基于概率统计的传统语言模型&…

云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标

一、什么是 Kubernetes CoreDNS&#xff1f; CoreDNS 是 Kubernetes 环境的DNS add-on 组件&#xff0c;它是在控制平面节点中运行的组件之一&#xff0c;使其正常运行和响应是 Kubernetes 集群正常运行的关键。DNS 是每个体系结构中最敏感和最重要的服务之一。应用程序、微服…

redis:六、数据过期删除策略(惰性删除、定期删除)和基于redisson实现的分布式锁(看门狗机制、主从一致性)和面试模板

数据过期删除策略 Redis的过期删除策略&#xff1a;惰性删除 定期删除两种策略进行配合使用 惰性删除 惰性删除&#xff1a;设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们在检查其是否过期&#xff0c;如果过期&#xff0c;我们就…

转载: iOS 优雅的处理网络数据

转载&#xff1a; iOS 优雅的处理网络数据 原文链接&#xff1a;https://juejin.cn/post/6952682593372340237 相信大家平时在用 App 的时候, 往往有过这样的体验&#xff0c;那就是加载网络数据等待的时间过于漫长&#xff0c;滚动浏览时伴随着卡顿&#xff0c;甚至在没有网…

NLP论文阅读记录-ACL 2023 | 10 Best-k Search Algorithm for Neural Text Generation

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1优势2.2 挑战 三.本文方法3.1 并行探索3.2 时间衰变3.3堆修剪3.4 模型得分 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果 五 总结 前言 用于神经文本生成…

【Transformer】Transformer and BERT(1)

文章目录 TransformerBERT 太…完整了&#xff01;同济大佬唐宇迪博士终于把【Transformer】入门到精通全套课程分享出来了&#xff0c;最新前沿方向 学习笔记 Transformer 无法并行&#xff0c;层数比较少 词向量生成之后&#xff0c;不会变&#xff0c;没有结合语境信息的情…

Transformer Decoder的输入

大部分引用参考了既安的https://www.zhihu.com/question/337886108/answer/893002189这篇文章&#xff0c;个人认为写的很清晰&#xff0c;此外补充了一些自己的笔记。 弄清楚Decoder的输入输出&#xff0c;关键在于图示三个箭头的位置&#xff1a; 以翻译为例&#xff1a; 输…