@state @prop @link
@prop是单向的,只能父组件传子组件
@link是双向的,可以子组件传父组件
爷孙组件的参数传递可以使用@provide和@consume进行双向数据传递。
兄弟组件之间数据传递可以使用共同的父组件或者全局状态管理(例如localStorage、AppStorage)
- @Provider和@Consumer vs @Provide和@Consume的区别?
| 能力 | V2 装饰器@Provider 和@Consumer V1 装饰器@Provide 和@Consume
本地初始化 允许本地初始化,当找不到@Provider 的时候使用本地默认值。 禁止本地初始化,当找不到对应的@Provide 时候,会抛出异常。
支持类型 支持 function。 不支持 function。
观察能力 仅能观察自身赋值变化,如果要观察嵌套场景,配合@Trace 一起使用。 观察第一层变化,如果要观察嵌套场景,配合@Observed 和@ObjectLink 一起使用。
alias 和属性名 alias 是唯一匹配的 key,如果缺省 alias,则默认属性名为 alias。 alias 和属性名都为 key,优先匹配 alias,匹配不到可以匹配属性名。
从父组件初始化 禁止。 允许。
支持重载 默认开启,即@Provider 可以重名,@Consumer 向上查找最近的@Provider。 默认关闭,即在组件树上不允许有同名@Provide。如果需要重载,则需要配置 allowOverride。
- foreach和lazyforeach
两者都是对容器组件进行数据加载和渲染。foreach是一次循环加载,lazyforeach是按需加载。
他们的参数有3个,其中两个必选一个可选,必选参数为数据源list,循环的回调;可选参数为函数生成键值
HAP是我们自己写的ability包
HSP是动态包,类似windows里的dll文件,可以通过路径引用,不会打包到app包里
HAR是静态包,类似windows里的lib文件,会打包到app包里
鸿蒙有两种多线程方式分别是taskpool和worker,一般情况用taskpool,常驻后台的线程任务用worker。
| 普通任务 | new taskpool.Task() | taskpool.execute() | 立即执行的短时任务,耗时不能超过3分钟。 |
| 延时任务 | new taskpool.Task() | taskpool.executeDelayed() | 为了不影响应用启动的性能,一些不影响启动的初始化类任务往往期望放在延时任务中执行,如拉取线上的配置信息等。 |
| 长时任务 | new taskpool.LongTask() | taskpool.execute() | 希望长时运行的任务一直保持执行,已为其他模块提供特定的服务,比如日志埋点,后台长链接保活等。 |
| 串行任务 | new taskpool.SequenceRunner(),new taskpool.Task() | SequenceRunner. execute() | 用于执行一组需要串行执行的任务 |
| 依赖任务 | task1.addDependency(task2), task1.removeDependency(task2) | taskpool.execute() | 任务之间存在先后依赖关系 |
onInitialize() - 在Ability创建时调用,用于执行初始化操作。
onStart() - 在Ability启动时调用,用于执行必要的准备工作。
onStop() - 在Ability停止时调用,用于释放资源和清理操作。
onDestroy() - 在Ability销毁时调用,用于进行最终的清理工作。
onActive() - 在Ability从后台返回前台时调用,用于执行恢复操作。
onInactive() - 在Ability从前台进入后台时调用,用于执行保存数据等操作。
页面生命周期是指被@Entry装饰的组件的生命周期,主要包含以下几个函数:
onPageShow:页面每次显示时触发,包括路由过程、应用进入前后台等场景。
onPageHide:页面每次隐藏时触发,包括路由过程、应用进入前后台等场景。
onBackPress:当用户点击返回按钮时触发。如果返回值为true,则无法通过返回键返回上一页,用户必须与页面交互才能返回。
自定义组件生命周期是指被@Component装饰的UI单元的生命周期,主要包含以下几个函数:
aboutToAppear:在创建自定义组件的新实例后,执行其build函数之前触发。可以在此函数中改变状态变量,更改将在后续执行build函数中生效。
onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
aboutToDisappear:在自定义组件销毁前触发。不允许在此函数中改变状态变量,特别是对@Link变量的修改可能会导致应用程序行为不稳定。
import { webview } from '@kit.ArkWeb'
@Entry
@Component
struct WebComponent {
controller: webview.WebviewController = new webview.WebviewController()
build() {
Column() {
// 三种加载网页的方式
Web({ src: $rawfile("index.html"), controller: this.controller })
Web({ src: "resource://rawfile/index.html", controller: this.controller })
Web({ src: 'www.example.com', controller: this.controller })
.zoomAccess(false)
.aspectRatio(1)
.javaScriptAccess(true)
.onPageEnd(async e => {
// 调用网页内函数并获取返回值
const res = await this.controller.runJavaScript('test()')
})
// 页面上调用 confirm() 函数时触发,以此来实现页面向原生通信
.onConfirm(event => {
})
}
}
}
// module.json5 访问网络前需要申请网络权限
"module": {
"requestPermissions": [
{"name": "ohos.permission.INTERNET"}
]
}
在不涉及复杂动效、交互、多级路由等场景时,可以使用router。但考虑到应用当前或以后可能出现的复杂场景,以及整体交互体验的一致性,推荐使用Navigation。Navigation可以完全替换router的能力。
- @Entry 装饰的页面,A 页面跳到 B 页面后再跳回 A 页面,如何获取 B 页面的返回值
router.back({
url: 'pages/Home',
params: {
info: '来自Home页'
}
})
// 通过调用 router.getParams() 方法进行获取
onPageShow() {
const params = router.getParams() as Record<string, string>
console.log(params)
}
缓存有三种方式,分别是localStorage、AppStorage和PresisentStorage。
localStorage是保存页面的数据,页面销毁数据消失。
AppStorage是app级的数据,App进程退出数据消失。
PresistentStorage是持久的数据,一般搭配AppStorage使用。
还有一种是preference,也可以持久存储数据,因为需要一个context参数,一般用于存储一些UI相关的东西。
另外就是数据库,有[键值数据库](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-kv-store-V5)和[关系数据库](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-rdb-store-V5)