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

        

        随着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.hqwc.cn/news/285905.html

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

相关文章

生成模型 | 三维重建(3D reconstruction)调研及总结【20231219更新版】

本文是关于三维重建的论文调研&#xff0c;主要集中于基于图片到3d的模型&#xff0c;其中期刊会议标志如下&#xff1a; [&#x1f916; ICCV 2023 ] 1.3D综述系列 2019_Image-based 3D Object Reconstruction: State-of-the-Art and Trends in the Deep Learning Era 论文地…

【HarmonyOS开发】ArkUI中的自定义弹窗

弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前&#xff0c;用户无法操作其他界面内容。ArkUI 为我们提供了丰富的弹窗功能&#xff0c;弹窗按照功能可以分为以下两类&#xff1a; 确认类&#xff1a;例如警告弹窗 Al…

企业微信自动登录自定义系统

方法一&#xff1a;企业微信构造OAuth2链接跳转登录到自定义系统 企业微信自定义应用配置 构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/…

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算…

探索拉普拉斯算子:计算机视觉中用于边缘检测和图像分析的关键工具

一、介绍 拉普拉斯算子是 n 维欧几里得空间中的二阶微分算子&#xff0c;表示为 ∇。它是函数梯度的发散度。在图像处理的上下文中&#xff0c;该运算符应用于图像的强度函数&#xff0c;可以将其视为每个像素具有强度值的二维信号。拉普拉斯算子是计算机视觉领域的关键工具&am…

“最美中国女生”——AI绘画还没上车的有难了!!!

废话少说&#xff0c;先上图&#xff01;&#xff01;&#xff01; 前段时间&#xff0c;ChatGPT生成了一张自诩为“最美的中国女生”。虽然审美是主观的&#xff0c;但不可否认&#xff0c;图片的客观美。不过——你不会还只是看到图片里的美女&#xff0c;肤浅地欣赏高颜值吧…

Java_正则表达式

正则表达式 接下来&#xff0c;我们学习一个全新的知识&#xff0c;叫做正则表达式。正则表达式其实是由一些特殊的符号组成的&#xff0c;它代表的是某种规则。 正则表达式的作用1&#xff1a;用来校验字符串数据是否合法 正则表达式的作用2&#xff1a;可以从一段文本中查找…

JavaOOP篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、一个java类中包含那些内容&#xff1f;二、那针对浮点型数据运算出现的误差的问题&#xff0c;你怎么解决&#xff1f;三、面向对象的特征有哪些方面?四、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff0…

springboot整合vue,将vue项目整合到springboot项目中

将vue项目打包后&#xff0c;与springboot项目整合。 第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-t…

luttuce(RedisTempate)实现hash(动态数据) expire lua脚本

话不多说先放脚本&#xff1a; local argv ARGV local length #argv if length > 0 then local unpackArgs {} for i 1, length - 1 dotable.insert(unpackArgs, argv[i]) end if redis.call(exists, KEYS[1]) 1 thenredis.call(del, KEYS[1])redis.call(hset, KEYS[…

Opencv C++ 绘制中文

零、源码 GitHub - ITC-AI/Opencv_Chinese: C 的 Opencv绘制中文 一、代码编写 参考 https://blog.csdn.net/long630576366/article/details/131440684 1、cvxFont.h #ifndef OPENCVUNICODE_CVXFONT_H #define OPENCVUNICODE_CVXFONT_H#include <ft2build.h> #inclu…

RabbitMQ入门指南(一):初识与安装

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消息队列介绍 1.同步调用和异步调用 2.常见消息队列介绍 二、RabbitMQ简介及其安装步骤 1.RabbitMQ简介 2.RabbitMQ安装步骤&#xff08;使用Docker&#xff09; (1) 创建网络 (2) 使用Docker来…