【最新鸿蒙应用开发】——警惕这些坑!不同API版本带来的差异

关于HarmonyOS的API从8到API12,存在不少版本的差异,比如一些ArkTS语法上的差异;一些组件在API9之前不支持的功能,本人在项目开发过程中也是踩了不少坑,现在给大家分享一下心得。

1.语法差异

首先是ArkTS语法上的差异。可以参考官方文档:从TypeScript到ArkTS语言适配规则| 华为开发者联盟 (huawei.com)

  • 函数表达式不支持,必须用箭头函数;

  • 展开运算符只支持数组;

  • 不支持赋值解构;

  • var 不支持,必须用 let 或者 const;

  • 类型限制更为严格,声明变量后面必须定义类型;

@Entry
@Component
struct ArkTSPage {build() {Column({ space: 20 }) {// 以下的是 不支持(推荐)的特性Button('1. 不使用Var').width('100%').onClick(() => {// 1. var有变量提升,不再建议使用//// var str// AlertDialog.show({ message: str })// str = '西兰花炒蛋'
​// 2. 使用 let替代(推荐写法!!!)let str = '西兰花炒蛋'AlertDialog.show({ message: str })// let str = '西兰花炒蛋'
​})
​
​Button('2. 声明变量+类型').width('100%').onClick(() => {//  api9可以不使用类型推断// let message = 'itheima'
​// next 刚出来必须写,现在可以省略
​// 1. 基本类型 直接写let food: string = '西兰花炒蛋'let age: number = 20
​// 2. 对象 可以结合 class 使用// class Food{//   name:string//   color:string////   constructor(name:string,color:string) {//     this.name = name//     this.color = color//   }// }// const f:Food = new Food('西兰花','黄绿色')
​// 3. 对象的字面量 结合 class的初始值class Food {name: string = ''color: string = ''}
​const f: Food = {name: '西兰花',color: '黄绿色'}})
​
​Button('3. for in').width('100%').onClick(() => {// 定义Class 并设置默认值class Food {name: string = ''color: string = ''}
​let food: Food = {name: '西兰花',color: '黄绿色'}
​// 不支持 for in// for (const key in food) {//   food[key] // ArkTS中  不推荐//   // food.key // 属性名 叫做key// }
​// 可以通过 Object.keys 结合 forEach 进行遍历// 获取 所有的key 字符串数组// const keys: string[] = Object.keys(food)// // AlertDialog.show({ message : JSON.stringify(keys)})// keys.forEach((key: string) => {//   AlertDialog.show({ message: key })// })Object.keys(food).forEach((key: string) => {AlertDialog.show({ message: key })})
​})
​Button('4. 解构赋值').width('100%').onClick(() => {class Food {name: string = ''color: string = ''}
​let food: Food = {name: '西兰花',color: '黄绿色'}
​// 不支持(不推荐)// const {name,color} = food
​// 通过 点语法取值const name: string = food.nameconst color: string = food.color
​})
​Button('5. 函数表达式').width('100%').onClick(() => {// 不支持 函数表达式// const sayHI:()=>void= function (){//   AlertDialog.show({message:'(づ ̄ 3 ̄)づ'})// }
​// 改写为 箭头函数// const sayHI: () => void = () => {//   AlertDialog.show({ message: '(づ ̄ 3 ̄)づ' })// }
​const sayHI: () => void = () => AlertDialog.show({ message: '(づ ̄ 3 ̄)づ' })
​})
​// 以下是部分支持的特性Button('6. 展开运算符...').width('100%').onClick(() => {// 用来合并数组 支持const numArr1: number[] = [1, 2, 3, 4]const numArr2: number[] = [4, 5, 6]
​// ArkTS中支持,可以使用const totalArr: number[] = [...numArr1, ...numArr2]// AlertDialog.show({ message: JSON.stringify(totalArr) })
​// 合并对象 不支持class Vegetable {name: string = ''color: string = ''}
​class Food {name: stringcolor: stringprice: number
​constructor(vegetable:Vegetable,price:number) {this.name =vegetable.namethis.color = vegetable.colorthis.price = price}}
​const vegetable: Vegetable = {name: '西兰花',color: '黄绿色'}
​// 不支持用来展开对象// const food:Food ={//   ...vegetable,//   price:10// }
​// 改写为挨个赋值即可const food:Food = new Food(vegetable,10)
​
​})
​// moreButton('..........更多').width('100%').onClick(() => {})}.padding(10)
​}
}

2. 组件用法上的差异

2.1. $$语法:内置组件双向同步

$$运算符为系统内置组件提供TS变量的引用,使得TS变量和系统内置组件的内部状态保持同步。

内部状态具体指什么取决于组件。例如,TextInput组件的text参数。

说明:

$$还用于@Builder装饰器的按引用传递参数,开发者需要注意两种用法的区别。

使用规则
  • 当前$$支持基础类型变量,以及@State、@Link和@Prop装饰的变量。

  • 当前$$支持的组件:

    组件支持的参数/属性起始API版本
    Checkboxselect10
    CheckboxGroupselectAll10
    DatePickerselected10
    TimePickerselected10
    MenuItemselected10
    Panelmode10
    Radiochecked10
    Ratingrating10
    Searchvalue10
    SideBarContainershowSideBar10
    Slidervalue10
    Stepperindex10
    Swiperindex10
    Tabsindex10
    TextAreatext10
    TextInputtext10
    TextPickerselected、value10
    ToggleisOn10
    AlphabetIndexerselected10
    Selectselected、value10
    BindSheetisShow10
    BindContentCoverisShow10
    Refreshrefreshing8
    GridItemselected10
    ListItemselected10
  • $$绑定的变量变化时,会触发UI的同步刷新。

使用示例

以TextInput方法的text参数为例:

// xxx.ets
@Entry
@Component
struct TextInputExample {@State text: string = ''controller: TextInputController = new TextInputController()
​build() {Column({ space: 20 }) {Text(this.text)TextInput({ text: $$this.text, placeholder: 'input your word...', controller: this.controller }).placeholderColor(Color.Grey).placeholderFont({ size: 14, weight: 400 }).caretColor(Color.Blue).width(300)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

3. API使用上的差异

首选项持久化在API10以后提供了同步接口来返回preferences实例,代码写法上更简洁实用。

dataPreferences.getPreferences

getPreferences(context: Context, options: Options): Promise<Preferences>

获取Preferences实例,使用Promise异步回调。

示例:

import UIAbility from '@ohos.app.ability.UIAbility';
import { BusinessError } from '@ohos.base'
import window from '@ohos.window';
​
let preferences: dataPreferences.Preferences | null = null;
​
class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let options: dataPreferences.Options = { name: 'myStore', dataGroupId: 'myId' };let promise = dataPreferences.getPreferences(this.context, options);promise.then((object: dataPreferences.Preferences) => {preferences = object;console.info("Succeeded in getting preferences.");}).catch((err: BusinessError) => {console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);})}
}

dataPreferences.getPreferencesSync10+

getPreferencesSync(context: Context, options: Options): Preferences

获取Preferences实例,此为同步接口。

示例:

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
​
let preferences: dataPreferences.Preferences | null = null;
​
class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let options: dataPreferences.Options = { name: 'myStore', dataGroupId: 'myId' };preferences = dataPreferences.getPreferencesSync(this.context, options);}
}

暂时想到这么多,有些在API9之前的API将会被废弃,以后再补充。

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

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

相关文章

实拆一个风扇

fr:徐海涛(hunkxu)

Qwen2——阿里巴巴最新的多语言模型挑战 Llama 3 等 SOTA

引言 经过几个月的期待&#xff0c; 阿里巴巴 Qwen 团队终于发布了 Qwen2 – 他们强大的语言模型系列的下一代发展。 Qwen2 代表了一次重大飞跃&#xff0c;拥有尖端的进步&#xff0c;有可能将其定位为 Meta 著名的最佳替代品 骆驼3 模型。在本次技术深入探讨中&#xff0c;我…

神经网络学习2

张量&#xff08;Tensor&#xff09;是深度学习和科学计算中的基本数据结构&#xff0c;用于表示多维数组。张量可以看作是一个更广义的概念&#xff0c;涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说&#xff0c;张量的维度可以是以下几种形式&#xff1a; 标量&am…

Spring-boot-logback-spring.xml文件Appender标签下的属性

在logback-spring.xml文件中&#xff0c;标签是通过set方法设置的值&#xff0c;例如下面的代码&#xff0c;属性hrName的值为TYC&#xff0c;当服务启动的时候&#xff0c;控制台会一直打印TYC三个字母 首先&#xff0c;我们自定义一个Appender&#xff0c;然后里面有一个属性…

【打鼹鼠game】

好的&#xff0c;我将为您编写一个简单的打鼹鼠游戏的代码。这个游戏会模拟一个简单的打鼹鼠游戏&#xff0c;玩家需要点击随机出现的鼹鼠。我们将使用Python编程语言和Pygame库来创建这个游戏。代码将包括以下部分&#xff1a; 初始化Pygame和游戏窗口。创建鼹鼠的类和属性。…

python面试题4: Python是按引用调用还是按值调用(难度--简单)

文章目录 题目回答 题目 Python是按引用调用还是按值调用&#xff1f; 回答 这题主要是考试对于python数据类型的认知。 1.首先对于不可变对象&#xff0c;字符&#xff0c;元组&#xff0c;数字往往是按引用进行调用,示例如下&#xff1a; def add(s):ssodd so add(s) …

LogicFlow 学习笔记——2. LogicFlow 基础 实例

LogicFlow 实例 创建实例 每一个流程设计界面&#xff0c;就是一个 LogicFlow 的实例。 <template><div id"container"></div><!-- 用于显示 LogicFlow 图表的容器 --> </template> <script>// 创建 LogicFlow 实例const lf …

Day03 链表概念与单向不循环链表的实现

目录 1、顺序表的优缺点 2、链式存储的线性表 3、单向不循环链表实现 1、顺序表的优缺点 顺序表的优点是: 由于顺序表数据元素的内存地址都是连续的,所以可以实现随机访问,而且不需要多余的信息来描述相关的数据,所以存储密度高。 顺序表的缺点是: 顺序表的数据在进行…

常用的JDK调优监控工具整理

JVM 调优首先要做的就是监控 JVM 的运行状态&#xff0c;这就需要用到各种官方和第三方的工具包了 一、 JDK 工具包 JDK 自带的 JVM 工具可以分为命令行工具和可视化工具 命令行工具 jps: JVM Process status tool&#xff1a;JVM进程状态工具&#xff0c;查看进程基本信息j…

Spring Aop及事务管理

5 Spring AOP AOP概述 AOP&#xff1a;全称是 Aspect Oriented Programming 即&#xff1a;面向切面编程。简单的说它就是把我们程序重复的代码抽取出来&#xff0c;在需要执行的时候&#xff0c;使用动态代理的技术&#xff0c;在不修改源码的基础上&#xff0c;对我们的已有…

SpringMVC框架学习笔记(七):处理 json 和 HttpMessageConverter 以及文件的下载和上传

1 处理 JSON-ResponseBody 说明: 项目开发中&#xff0c;我们往往需要服务器返回的数据格式是按照 json 来返回的 下面通过一个案例来演示SpringMVC 是如何处理的 &#xff08;1&#xff09; 在web/WEB-INF/lib 目录下引入处理 json 需要的 jar 包&#xff0c;注意 spring5.x…

OpenCV练习(1)签名修复

1.目的 在学校的学习过程中&#xff0c;需要递交许多材料&#xff0c;且每份材料上都需要对应负责人签名&#xff0c;有时候找别人要签名&#xff0c;然后自己粘贴的话&#xff0c;会出现签名模糊&#xff0c;背景不是纯白透明。为此以word中的“颜色校正”功能为参照&#xf…

基于iBeacon蓝牙定位技术的反向寻车系统

随着城市化进程的加速和汽车保有量的不断增加&#xff0c;大型停车场成为了人们日常生活中不可或缺的一部分。然而&#xff0c;在繁忙的停车场中快速找到自己的车辆&#xff0c;成为了许多车主的难题。为了解决这一问题&#xff0c;维小帮基于iBeacon蓝牙技术打造的反向寻车系统…

Linux 编写脚本自动清理旧的日志文件,释放磁盘空间

摘要:在我们的后端中每天会产生大量的日志,如果不定期清理会导致系统异常,本文讲解编写一个脚本根据日志文件的修改时间来清理日志,而无需理会日志的命名,从而使脚本更通用。 创建脚本文件: cd /data/shell vi clean_logs.sh此时进入到vi编辑器,在编辑器输入以下内容:…

Android开发AndroidStudio安装教程

本文图示展示AndroidStudio安装教程。 目录 一、下载安装包 二、安装 一、下载安装包 https://developer.android.google.cn/studio?hlzh-cn 二、安装 双击exe Next Next Next 默认点击Install Next 点击finish进入设置文件界面。 如果本地有设置文件&#xff0c;选择C…

推荐一款可以下载B站视频和音频的工具

cobalt是一个免费的下载网站&#xff0c;主要是用于载视频和音频。只要你把相应的网址复制下来&#xff0c;然后打开cobalt网站&#xff0c;黏贴网址&#xff0c;选择要下载的格式&#xff0c;就可以下载相应的音频或者视频了。 该网站非常简洁&#xff0c;使用也很简单。目前只…

【机器学习】Dify:AI智能体开发平台版本升级

一、引言 关于dify&#xff0c;之前力推过&#xff0c;大家可以跳转 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署了解&#xff0c;今天主要以dify为例&#xff0c;分享一下如何进行版本升级。 二、版本升级 2.1 原方案 #首次…

大模型与知识智能:心理疾病治疗的新希望

前言 随着社会的发展&#xff0c;心理疾病已成为一个日益突出的问题。据《柳叶刀》杂志的系统性综述显示&#xff0c;疫情之后&#xff0c;全世界抑郁症与焦虑症的患病率上升超过25%&#xff0c;其中青少年心理健康的影响最大。此外&#xff0c;2021年国内的精神障碍报告显示&…

光照药物稳定性试验箱百科

概念与作用 - 药品稳定性试验箱&#xff1a;一种精密设备&#xff0c;用于模拟药品在不同环境条件下的存储情况。 - 环境模拟&#xff1a;通过控制温度、湿度等参数&#xff0c;复制各种实际储存条件&#xff0c;以测试药品稳定性。 - 保障药品质量&#xff1a;通过试验&…

Python 3 列表

Python 3 列表 Python 3 中的列表是一种基本的数据结构,用于存储一系列有序的元素。列表是可变的,这意味着可以修改其内容。在 Python 中,列表是非常灵活和强大的,广泛用于各种编程任务。 创建列表 创建列表非常简单,只需将元素用逗号分隔,并包围在方括号 [] 内。例如…