【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
目录
1 -> 生命周期
1.1 -> 应用生命周期
1.2 -> 页面生命周期
2 -> 资源限定与访问
2.1 -> 资源限定词
2.2 -> 资源限定词的命名要求
2.3 -> 限定词与设备状态的匹配规则
2.4 -> 引用JS模块内resources资源
3 -> 多语言支持
3.1 -> 定义资源文件
3.2 -> 引用资源
1 -> 生命周期
1.1 -> 应用生命周期
在app.js中可以定义如下应用生命周期函数:
属性 | 类型 | 描述 | 触发时机 |
onCreate | () => void | 应用创建 | 当应用创建时调用。 |
onShow6+ | () => void | 应用处于前台 | 当应用处于前台时触发。 |
onHide6+ | () => void | 应用处于后台 | 当应用处于后台时触发。 |
onDestroy | () => void | 应用销毁 | 当应用退出时触发。 |
1.2 -> 页面生命周期
在页面JS文件中可以定义如下页面生命周期函数:
属性 | 类型 | 描述 | 触发时机 |
onInit | () => void | 页面初始化 | 页面数据初始化完成时触发,只触发一次。 |
onReady | () => void | 页面创建完成 | 页面创建完成时触发,只触发一次。 |
onShow | () => void | 页面显示 | 页面显示时触发。 |
onHide | () => void | 页面消失 | 页面消失时触发。 |
onDestroy | () => void | 页面销毁 | 页面销毁时触发。 |
onBackPress | () => boolean | 返回按钮动作 | 当用户点击返回按钮时触发。 - 返回true表示页面自己处理返回逻辑。 - 返回false表示使用默认的返回逻辑。 - 不返回值会作为false处理。 |
onActive()5+ | () => void | 页面激活 | 页面激活时触发。 |
onInactive()5+ | () => void | 页面暂停 | 页面暂停时触发。 |
onNewRequest()5+ | () => void | FA重新请求 | FA已经启动时收到新的请求后触发。 |
页面A的生命周期接口的调用顺序
-
打开页面A:onInit() -> onReady() -> onShow()
-
在页面A打开页面B:onHide()
-
从页面B返回页面A:onShow()
-
退出页面A:onBackPress() -> onHide() -> onDestroy()
-
页面隐藏到后台运行:onInactive() -> onHide()
-
页面从后台运行恢复到前台:onShow() -> onActive()
2 -> 资源限定与访问
2.1 -> 资源限定词
资源限定词可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括屏幕密度等维度,限定词之间通过中划线(-)连接。在resources目录下创建限定词文件时,需要掌握限定词文件的命名要求以及与限定词文件与设备状态的匹配规则。
2.2 -> 资源限定词的命名要求
-
限定词的组合顺序:屏幕密度。开发者可以根据应用的使用场景和设备特征,选择其中的一类或几类限定词组成目录名称,顺序不可颠倒。
-
限定词的连接方式:限定词之间均采用中划线(-)连接。例如:res-dark-ldpi.json 。
-
限定词的取值范围:每类限定词的取值必须符合下表的条件,否则,将无法匹配目录中的资源文件,限定词大小写敏感。
-
限定词前缀:resources资源文件的资源限定词有前缀res,例如res-ldpi.json。
-
默认资源限定文件:resources资源文件的默认资源限定文件为res-defaults.json。
-
资源限定文件中不支持使用枚举格式的颜色来设置资源。
类型 | 含义与取值说明 |
屏幕密度 | 表示设备的屏幕密度(单位为dpi),取值如下: - sdpi:表示低密度屏幕(~120dpi)(0.75基准密度) - mdpi:表示中密度屏幕(~160dpi)(基准密度) - ldpi:表示高密度屏幕(~240dpi)(1.5基准密度) - xhdpi:表示加高密度屏幕(~320dpi)(2.0基准密度) - xxhdpi:表示超超高密度屏幕(~480dpi)(3.0基准密度) - xxxhdpi:表示超超超高密度屏幕(~640dpi)(4.0基准密度) |
2.3 -> 限定词与设备状态的匹配规则
-
在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:MCC和MNC> 横竖屏 > 深色模式 > 设备类型 > 屏幕密度。在资源限定词目录均未匹配的情况下,则匹配默认资源限定文件。
-
如果限定词目录中包含资源限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如:资源限定文件res-hdpi.json与当前设备密度xhdpi无法匹配。
2.4 -> 引用JS模块内resources资源
在应用开发的hml和js文件中使用$r的语法,可以对JS模块内的resources目录下的json资源进行格式化,获取相应的资源内容,该目录与pages目录同级。
属性 | 类型 | 描述 |
$r | (key: string) => string | 获取资源限定下具体的资源内容。例如:$r('strings.hello')。 参数说明: - key:定义在资源限定文件中的键值,如strings.hello。 |
res-defaults.json示例:
{"strings": { "hello": "hello world" }
}
3 -> 多语言支持
基于开发框架的应用会覆盖多个国家和地区,开发框架支持多语言能力后,可以让应用开发者无需开发多个不同语言的版本,就可以同时支持多种语言的切换,为项目维护带来便利。
3.1 -> 定义资源文件
资源文件用于存放应用在多种语言场景下的资源内容,开发框架使用JSON文件保存资源定义。在文件组织中指定的i18n文件夹内放置语言资源文件,其中语言资源文件的命名是由语言、文字、国家或地区的限定词通过中划线连接组成,其中文字和国家或地区可以省略,如zh-Hant-HK(中国香港地区使用的繁体中文)、zh-CN(中国使用的简体中文)、zh(中文)。命名规则如下:
language[-script-region].json
限定词的取值需符合下表要求。
限定词类型 | 含义与取值说明 |
语言 | 表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。 |
文字 | 表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如:Hans表示简体中文,Hant表示繁体中文。 |
国家或地区 | 表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如:CN表示中国,GB表示英国。 |
当开发框架无法在应用中找到系统语言的资源文件时,默认使用en-US.json中的资源内容。
资源文件内容格式如下:
en-US.json
{"strings": {"hello": "Hello world!","object": "Object parameter substitution-{name}","array": "Array type parameter substitution-{0}","symbol": "@#$%^&*()_+-={}[]\\|:;\"'<>,./?"},"files": {"image": "image/en_picture.PNG"}
}
由于不同语言针对单复数有不同的匹配规则,在资源文件中使用“zero”“one”“two”“few”“many”“other”定义不同单复数场景下的词条内容。例如中文不区分单复数,仅存在“other”场景;英文存在“one”、“other”场景;阿拉伯语存在上述6种场景。
以en-US.json和ar-AE.json为例,资源文件内容格式如下:
en-US.json
{"strings": {"people": {"one": "one person","other": "{count} people"}}
}
ar-AE.json
{"strings": {"people": {"zero": "لا أحد","one": "وحده","two": "اثنان","few": "ستة اشخاص","many": "خمسون شخص","other": "مائة شخص"}}
}
3.2 -> 引用资源
在应用开发的页面中使用多语言的语法,包含简单格式化和单复数格式化两种,都可以在hml或js中使用。
-
简单格式化方法
在应用中使用$t方法引用资源,$t既可以在hml中使用,也可以在js中使用。系统将根据当前语言环境和指定的资源路径(通过$t的path参数设置),显示对应语言的资源文件中的内容。
属性 | 类型 | 必填 | 描述 |
$t | Function | 是 | 根据系统语言完成简单的替换:this.$t('strings.hello') |
参数 | 类型 | 必填 | 描述 |
path | string | 是 | 资源路径 |
params | ArrayObject | 否 | 运行时用来替换占位符的实际内容,占位符分为两种: - 具名占位符,例如{name}。实际内容必须用Object类型指定,例如:$t('strings.object', {name:'Hello world'})。 - 数字占位符,例如{0}。实际内容必须用Array类型指定,例如:$t('strings.array', [Hello world'] |
简单格式化示例代码
<!-- test.hml -->
<div><!-- 不使用占位符,text中显示“Hello world!” --><text>{{ $t('strings.hello') }}</text><!-- 具名占位符格式,运行时将占位符{name}替换为“Hello world” --><text>{{ $t('strings.object', { name: 'Hello world' }) }}</text><!-- 数字占位符格式,运行时将占位符{0}替换为“Hello world” --><text>{{ $t('strings.array', ['Hello world']) }}</text><!-- 先在js中获取资源内容,再在text中显示“Hello world” --><text>{{ hello }}</text><!-- 先在js中获取资源内容,并将占位符{name}替换为“Hello world”,再在text中显示“Object parameter substitution-Hello world” --><text>{{ replaceObject }}</text><!-- 先在js中获取资源内容,并将占位符{0}替换为“Hello world”,再在text中显示“Array type parameter substitution-Hello world” --><text>{{ replaceArray }}</text><!-- 获取图片路径 --><image src="{{ $t('files.image') }}" class="image"></image><!-- 先在js中获取图片路径,再在image中显示图片 --><image src="{{ replaceSrc }}" class="image"></image>
</div>
// test.js
// 下面为在js文件中的使用方法。
export default {data: {hello: '',replaceObject: '',replaceArray: '',replaceSrc: '',},onInit() {this.hello = this.$t('strings.hello');this.replaceObject = this.$t('strings.object', { name: 'Hello world' });this.replaceArray = this.$t('strings.array', ['Hello world']);this.replaceSrc = this.$t('files.image');},
}
- 单复数格式化方法
属性 | 类型 | 必填 | 描述 |
$tc | Function | 是 | 根据系统语言完成单复数替换:this.$tc('strings.people') 说明: > 定义资源的内容通过json格式的key为“zero”、“one”、“two”、“few”、“many”和“other”区分。 |
参数 | 类型 | 必填 | 描述 |
path | string | 是 | 资源路径 |
count | number | 是 | 要表达的值 |
- 单复数格式化示例代码
<!--test.hml-->
<div><!-- 传递数值为0时: "0 people" 阿拉伯语中此处匹配key为zero的词条--><text>{{ $tc('strings.people', 0) }}</text><!-- 传递数值为1时: "one person" 阿拉伯语中此处匹配key为one的词条--><text>{{ $tc('strings.people', 1) }}</text><!-- 传递数值为2时: "2 people" 阿拉伯语中此处匹配key为two的词条--><text>{{ $tc('strings.people', 2) }}</text><!-- 传递数值为6时: "6 people" 阿拉伯语中此处匹配key为few的词条--><text>{{ $tc('strings.people', 6) }}</text><!-- 传递数值为50时: "50 people" 阿拉伯语中此处匹配key为many的词条--><text>{{ $tc('strings.people', 50) }}</text><!-- 传递数值为100时: "100 people" 阿拉伯语中此处匹配key为other的词条--><text>{{ $tc('strings.people', 100) }}</text>
</div>
感谢各位大佬支持!!!
互三啦!!!
相关文章:

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…...

CSS(快速入门)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…...

使用 concurrently 实现前后端一键启动
使用 concurrently 实现前后端一键启动 本文适合: 前后端分离项目(如 React Node.js),希望通过一条命令同时启动前端和后端服务。 工具链: Node.js、npm、concurrently。 耗时: 3 分钟。 文章目录 使用 c…...

常见端口的攻击思路
端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...

大数据治理实战:架构、方法与最佳实践
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段,尤其在数据驱动决策和人工智能应用日益普及的背景下&…...

忘记宝塔的访问地址怎么找
在linux中安装宝塔面板后会生成网址、账号和密码 如果网址忘记了那将进不去宝塔面板该怎么办呢? bt命令 我们输入 bt 命令的时候,是在根目录里面进行操作的。 / bt 我们根据自己的需要,选择对应的数字就可以了。 bt 14 输入 14 查看面板默…...

SQL教程-基础语法
INSERT INTO 新增数据 INSERT INTO 数据表名 VALUES (值1,值2,值3,...) DELETE 删除数据 DELETE FROM 数据表名 WHERE 查询条件 UPDATE 修改数据 UPDATE 数据表名 SET 字段1 值1, 字段2值2, ... WHERE 查询条件 SELECT 查询数据 #查询数据 SELECT 字段1, 字段2, ... FROM 数…...

shell脚本批量修改文件名之方法(The Method of Batch Modifying File Names in Shell Scripts)
shell脚本批量修改文件名方法 我们可以使用Shell脚本来实现这个功能。Shell脚本是一种用于自动化任务的编程语言,它可以在Unix/Linux操作系统上运行。在这个脚本中,我们将使用一个for循环来遍历目标目录下的所有文件,并使用mv命令将每个文件…...

组合模式 - 组合模式的实现
引言 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,从而简化了代码的复杂性。本文将详细介绍如何在C中实…...

视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM
Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …...

【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1QPSK 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章 《基于FPGA的QPSK帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可…...

c++面试:类定义为什么可以放到头文件中
这个问题是刚了解预编译的时候产生的疑惑。 声明是指向编译器告知某个变量、函数或类的存在及其类型,但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。定义不仅告诉编译器实体的存在,还会为该实体分配存储空间&#…...

PythonFlask框架
文章目录 处理 Get 请求处理 POST 请求应用 app.route(/tpost, methods[POST]) def testp():json_data request.get_json()if json_data:username json_data.get(username)age json_data.get(age)return jsonify({username: username测试,age: age})从 flask 中导入了 Flask…...

Kotlin开发(六):Kotlin 数据类,密封类与枚举类
引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…...

冬天适合养什么鱼?
各位鱼友们,冬天来了,是不是还在为养什么鱼而烦恼?别担心,今天就来给大家好好推荐一些适合冬天养的鱼,让你的水族箱在寒冷的冬天也能生机勃勃! 一、金鱼:冬日里的“小暖男” 金鱼绝对是冬季养鱼…...

【C++动态规划 状态压缩】2597. 美丽子集的数目|2033
本文涉及知识点 C动态规划 LeetCode2597. 美丽子集的数目 给你一个由正整数组成的数组 nums 和一个 正 整数 k 。 如果 nums 的子集中,任意两个整数的绝对差均不等于 k ,则认为该子数组是一个 美丽 子集。 返回数组 nums 中 非空 且 美丽 的子集数目。…...

前端-Rollup
Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...

20【变量的深度理解】
一说起变量,懂点编程的都知道,但是在理解上可能还不够深 变量就是存储空间,电脑上的存储空间有永久(硬盘)和临时(内存条)两种,永久数据重启电脑后依旧存在,临时数据只…...

大数据学习之Kafka消息队列、Spark分布式计算框架一
Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时,您以事件的 形式执行…...

基于Flask的旅游系统的设计与实现
【Flask】基于Flask的旅游系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为后端开发语言,结合前端Bootstrap框架,为用户提供了丰富…...

“AI视频智能分析系统:让每一帧视频都充满智慧
嘿,大家好!今天咱们来聊聊一个特别厉害的东西——AI视频智能分析系统。想象一下,如果你有一个超级聪明的“视频助手”,它不仅能自动识别视频中的各种元素,还能根据内容生成详细的分析报告,是不是感觉特别酷…...

算法随笔_31:移动零
上一篇:算法随笔_30: 去除重复字母-CSDN博客 题目描述如下: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,…...

改进候鸟优化算法之二:基于混沌映射的候鸟优化算法(MBO-CM)
基于混沌映射的候鸟优化算法(Migrating Birds Optimization based on Chaotic Mapping,MBO-CM)是一种结合了混沌映射与候鸟优化算法(Migrating Birds Optimization,MBO)的优化方法。 一、候鸟优化算法(MBO)简介 候鸟优化算法是一种自然启发的元启发式算法,由Duman等人…...

在Docker 容器中安装 Oracle 19c
在 Docker 容器中安装 Oracle 19c 是可行的,但它相较于其他数据库(如 MySQL、PostgreSQL 等)会复杂一些,因为 Oracle 数据库有一些特定的要求,如操作系统和库的依赖,以及许可证问题。 不过,Ora…...

使用Avalonia UI实现DataGrid
1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中,DataGrid 是一个独立的包 Avalonia.Controls.DataGrid,因此需要单独通过 NuGet 安装。接下来,将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…...

MySQL中的读锁与写锁:概念与作用深度剖析
MySQL中的读锁与写锁:概念与作用深度剖析 在MySQL数据库的并发控制机制中,读锁和写锁起着至关重要的作用。它们是确保数据在多用户环境下能够正确、安全地被访问和修改的关键工具。 一、读锁(共享锁)概念 读锁,也称为…...

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)
大家好,今天是Dest1ny漏洞库的专题!! 会时不时发送新的漏洞资讯!! 大家多多关注,多多点赞!!! 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚…...

python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算
【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。 按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位异或运算: 两个等长度二进制数上下对齐,相…...

【面试】【编程范式总结】面向对象编程(OOP)、函数式编程(FP)和响应式编程(RP)
一、编程范式总结 编程范式是指开发软件时采用的一种方法论或思维方式,主要包括面向对象编程(OOP)、**函数式编程(FP)和响应式编程(RP)**等。这些范式的不同特性和适用场景,帮助开发…...

创建要素图层和表视图
操作方法: 下面按照步骤学习如何使用Make Feature Layer和Make Table View工具 1.在arcmap中打开活动地图文档 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "<>" 4.使用try语句,使用Make Feature Layer工具创建内存副本 try:flayer arcpy.Ma…...