清浊-《鸿蒙应用程序开发-董昱》-第五章JavaScript UI设计 原创 精华
Der_带鱼
发布于 2021-9-17 20:05
浏览
10收藏
清浊-《鸿蒙应用程序开发-董昱》-第五章JavaScript UI设计
引言
一、本文的目的
- 1.本文是读书笔记,学习笔记。包含书中内容的对比总结、关键提炼、知识补充、思维导图。在JS UI开发的学习过程,会着重思考与Java UI开发的差异。
- 2.鉴于官方文档关于JS UI的讲解很散乱、不聚焦,在北向HCIA学习路上就需要各位大佬出的书和视频来助力,近期会从三本书籍去学习JS UI开发去学习和祖做笔记,并对三本书关于这一块儿知识的讲解做一个总结,最后解析JS UI官方示例工程。书籍分别是《鸿蒙应用程序开发-董昱》、《鸿蒙操作系统应用开发实践-中科院》、《鸿蒙操作系统开发入门经典-徐文礼》
二、学习《鸿蒙应用程序开发-董昱》的体验
- 1.代码很规范!很规范!很规范!有注解
- 2.董昱老师的示例代码目前已学习到的,没有是直接从官方文档的示例代码拿下来的,很用心了。示例代码块的上方都有所在文件的位置!!!!不需要焦虑代码该敲在哪儿的问题了。
- 3.在JS UI这块儿官方文档的知识很散乱,不聚焦,董昱老师的讲解很系统
- 4.董昱老师对参数的解释很到位
- 5.方法的图解、概念的图示都很到位
- 6.最后也是最关键的一点!董昱老师的《鸿蒙应用程序开发》有免费的配套课程!!!!鸿蒙应用程序开发视频教程
- 7.学习JS开发官方文档,以下两个文档比较好。
一、JavaScript UI设计
5.0概述
- Java UI与JS UI
- 区别
- Java UI开发 安卓型(事件式编程范式)
- JS UI开发 Web前端(声明式编程范式)
- 联系
- JS UI更加倾向于界面开发,在复杂业务逻辑方面,需要Java来帮忙。
- 在轻量级智能穿戴设备上的JS UI会更轻量级一点,并不能使用所有的JS UI特性
- 区别
- HML与HTML
- 区别
- HML:鸿蒙标记语言,表述用户界面结构
- HTML:超文本标记语言,描述 web文档的一种标记语言(大家熟知不做赘述)
- 联系
- 一门标记语言
- 一种文件类型
- HTML与HML的用法及其相似
- 区别
5.1 初识Js UI
5.1.1 JS实例与页面
(1)概念辨析
-
1.创建工程
- 继承的类有变化
- 之前:Ability
- 现在:AceAbility
- 主要管理JS目录下的文件
- 关于:common.images文件夹的疑惑,其实就是形式上变了一点点而已,不影响的。
- 继承的类有变化
-
2.实例与页面
-
实例(JavaScript实例):
- 一组与功能相关的用户界面和功能
- 默认的实例名称为default
-
实例与Ability
- 每个独立的实例都被独立的Ability管理
- default实例默认被MainAbility管理
-
实例与Page
- 在实例中,可以创建多个用户界面,其中每个用户界面被称为一个页面(Page)
-
实例、页面、Ability可视化关系图
-
JS UI的页面(Page)与Java UI中的界面(AbilitySlice)
- 两者相似
- 要用于承载单个页面的具体逻辑实现和界面UI,是应用显示、运行和跳转的最小单元
-
实例配置
- 位置:config.json
- 属性:
- name:实例名,默认default
- pages:声明实例所包含的页面
- Page属性是页面路径组成的数组
- 页面路径是以实例目录为根目录的路径,不带后缀
- window:声明与虚拟像素相关的选项
- designWidth:虚拟宽度(px像素此时也是虚拟)
- autoDesignWidth:是否启动(fasle且不设虚拟宽度则px为实际物理宽度)
- 代码:
-
(2)概念补充
-
关于视觉中的基础概念补充HarmonyOS官方文档-设计-视觉风格-基础概念
- 虚拟像素单位:vp
- 虚拟像素(virtual pixel)是一台设备针对应用而言所具有的虚拟尺寸(区别于屏幕硬件本身的像素单位)。它提供了一种灵活的方式来适应不同屏幕密度的显示效果。
- 字体像素单位:fp
- 字体像素(font pixel) 大小默认情况下与 vp 相同,即默认情况下 1 fp = 1vp。如果用户在设置中选择了更大的字体,字体的实际显示大小就会在 vp 的基础上乘以 scale 系数,即 1 fp = 1 vp * scale。
- 虚拟像素单位:vp
-
关于尺寸单位的补充HarmonyOS官方文档-Native API-JS API-语法-CSS语法参考
- 逻辑像素px(文档中以<length>表示):
1. 默认卡片具有的逻辑宽度为150px,实际显示时会将页面布局缩放至屏幕实际宽度,如100px在宽度为300的卡片上,实际渲染为200物理像素(从150px向300物理像素,所有尺寸放大2倍)。
2. 额外配置autoDesignWidth为true时,逻辑像素px将按照屏幕密度进行缩放,如100px在屏幕密度为3的设备上,实际渲染为300物理像素。应用需要适配多种设备时,建议采用此方法。
- 逻辑像素px(文档中以<length>表示):
5.1.2 新JS实例
- 两种方法
-
- 创建新的JS UI的PA,并同时创建实例
-
- 解疑:Launcher Ability
-
- 仅创建一个新的实例
-
- Ability与实例的指定
- 跟Java中Ability与AbilitySlice的指定是类似的
- Java中通过setUIContent()
- Js中通过setInstanceName()
- 注:
- 1.默认情况MainAbility加载default实例,不需要通过setInstanceName()传入default这个实例名称字符串。
- 2.setInstanceName(String name)的参数“name”指实例名称,实例名称与config.json文件中module.js.name的值对应。
- 跟Java中Ability与AbilitySlice的指定是类似的
5.1.3 初识页面
- 讲JS开发目录的介绍,着重讲清楚了i18n目录的来历、结构、用处。
- 其他内容见HarmonyOS官方文档-开发-UI-JS UI框架-初步体验JS FA应用-JS FA概述
5.1.4页面跳转
(1)概念
-
页面栈:JS UI中,支持页面的层级结构,即上层页面遮盖下层页面,形成栈结构。
-
页面路由:页面的跳转关系被称为页面路由,由JS UI的router模块来管理,需要js文件的export default的代码块前进行导入
-
import router from '@system.router';
-
(2)router模块
- ctrl+鼠标左键router进去以后,对英文注解进行翻译
- 方便记忆的方法总结(老师书上还对参数做了一定的解释,特别棒)
- push(obj: Router Options):跳转(覆盖)
- replace(obj: RouterOptions):跳转(销毁)
- back(obj?: BackRouterOptions):返回
- clear():清除(被遮盖的页面)
- getLength():堆栈中的页数
- getState():获取有关当前页面状态的信息,返回IRouterState对象,该对象包括index、name、path。
- index:整型,表示当前页面所在的页面栈中的位置,从底层到顶层是从1开始计数的
- name:字符串,表示当前页面的文件名
- path:字符串,表示当前页面的路径
- 方便记忆的方法总结(老师书上还对参数做了一定的解释,特别棒)
/**
* @Syscap SysCap.ACE.UIEngine
*/
export default class Router {
/**
* Navigates to a specified page in the application based on the page URL and parameters.
* 根据页面URL和参数导航到应用程序中的指定页面。
* @param obj
*/
static push(obj: RouterOptions): void;
/**
* Replaces the current page with another one in the application. The current page is destroyed after replacement.
* 用应用程序中的另一页替换当前页。替换后,当前页面将被销毁。
* @param obj
*/
static replace(obj: RouterOptions): void;
/**
* Returns to the previous page or a specified page.
* 返回上一页或指定页。
* @param obj
*/
static back(obj?: BackRouterOptions): void;
/**
* Clears all historical pages and retains only the current page at the top of the stack.
* 清除所有历史页面,并在堆栈顶部仅保留当前页面。
*/
static clear(): void;
/**
* Obtains the number of pages in the current stack.
* 获取当前堆栈中的页数。
* @returns Number of pages in the stack. The maximum value is 32.
*/
static getLength(): string;
/**
* Obtains information about the current page state.
* 获取有关当前页面状态的信息。
* @returns Page state.
*/
static getState(): RouterState;
}
-
出入栈与方法的对应
- push:新页面入栈
- back:当前页面出栈
- replace:把当前页面出栈、替换的新页面入栈
- clear:把当前页面以下的所有页面都出栈
(3)实现index页面跳转到secpage页面
-
index.js中实现跳转代码
-
//index.js //导入router模块 import router from '@system.router'; export default { data: { harmony:null }, onInit() { this.harmony ="董昱老师YYDS" }, //跳转到secpage的方法 toSecPage(){ //通过push方法入栈 router.push({ //指定跳转位置 uri:'pages/index/secpages/secpages', //传递数据 params:{ harmony: this.harmony } }); } }
-
进行一些基本的设置以后,动图奉上!
(4)使用被传递的数据,并实现从SecPage返回index
-
在secpage.js里接收index传过来数据,并通过console.info(message)方法将字符串变量以HiLog的形式输出
-
//secpage.js import router from '@system.router'; export default { data: { title: '跳转成功' }, onInit(){ //输出刚被传递出来的Harmony字符串 console.info(this.harmony); }, back(){ router.back(); } }
5.1.5 页面的生命周期函数
- 这一块儿,书中没有官方文档讲得详细,图解也没有那么易懂,所以采取的互相补充的方式
- HarmonyOS官方文档-JS API参考-手机、平板、智能屏和智能穿戴开发-框架说明-生命周期
(1)页面生命周期(总结+补充)
-
页面生命周期(书中只讲了前5个即从初始化到销毁的生命周期)
(2)页面A的生命周期接口的调用顺序
- 打开页面A:onInit() -> onReady() -> onShow()
- 在页面A打开页面B:onHide()
- 从页面B返回页面A:onShow()
- 退出页面A:onBackPress() -> onHide() -> onDestroy()
- 页面隐藏到后台运行:onInactive() -> onHide()
- 页面从后台运行恢复到前台:onShow() -> onActive()
- 注意:
- 调用生命周期函数,可以通过conslole.info()进行打印
- 通过onBackPress()方法监听系统返回事件
- 一个完整的页面生命周期中,至少会被调用一次,并且onInit() 、onReady()、onDestroy()仅能被调用一次
(3)Java UI中与JS UI中Page Ability的对比(补充)
-
相关官方文档
-
Page的组成单元
- Java UI中是AbilitySlice(AbilitySlice主要用于承载单个页面的具体逻辑实现和界面UI,是应用显示、运行和跳转的最小单元)
- JS UI中是JavaScript实例(见5.1.1)
-
组成单元的生命周期与Page Ability的生命周期
- 组成单元的生命周期依托于Page的生命周期。组成单元的生命周期与Page的相应回调类似,但组成单元还具有独立于Page的生命周期变化,如同一Page中的AbilitySlice之间导航时,此时Page的生命周期状态不会改变。
-
图解
- Java UI
- Js UI
5.1.6 应用对象(应用生命周期)
(1)应用生命周期(4个)
-
注意
- 在任何一个页面中,通过this.$app代码即可获取当前的应用对象,应用对象应用自身的生命周期,开发者可以在应用对象中实现JavaScript全局变量。
- 在onCreate()、onDestroy()两种方法中可以实现数据库的管理,例如:在前者方法中执行一些初始化操作(网络连接、账号检查)、在后者方法中检查数据库是否关闭,如果未关闭则要立即关闭。
(2)共享应用对象的变量(全局变量)
应用对象是一个单例,在应用对象中定义的变量可以在所有页面中进行调用。
-
在app.js中添加1个变量jumpCount,用于记录用户的页面跳转次数,然后创建该变量的Get/Set方法
-
//app.js export default { data:{ jumpCount:null }, //获取页面跳转次数 getJumpCount(){ return this.jumpCount; }, //设置页面的跳转次数 setJumcount(){ this.jumpCount =count; }, //页面的跳转次数 +1 increaseJumpCount(){ this.jumpCount ++; }, onCreate() { this.jumpCount =0; //初始化页面的跳转次数为0 console.info('AceApplication onCreate'); }, onDestroy() { console.info('AceApplication onDestroy'); } };
- 对index.js和secpage.js进行相应的设置最后的日志
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
book_route_20210915.zip 420.31K 18次下载
赞
9
收藏 10
回复
相关推荐
很详细的学习笔记,有点想买本董老师的书看看了。
哎呦,这有点不好意思了。惭愧惭愧。
不过非常感谢老师您的支持哈。
真滴很不错,书上的的配套源代码也分得很细,学习的时候很方便找到。简单举个例子~