总览:
Stage模型
应用上下文Context
共享包:HSP、HAR
装饰器
生命周期
路由
数据管理技术
并发问题
API
卡片
性能优化
待续…
1、Stage模型
1、由AbilityStage,创建出UIAbility,我们创建的Ability继承了UIAbility
2、UIAbility 创建 WindowStage
3、WindowStage 创建 Window
4、Window 展示 Page
2、应用上下文Context
Context
ApplicationContext
AbilityStageContext
UIAbilityContext
ExtensionContext
ServiceExtensionContext/FormExtensionContext
- 各类Context的继承关系
- 各类Context的持有关系
- 获取UIAbilityContext
// 在UIAbility中可以通过this.context获取UIAbility实例的上下文信息。
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 获取UIAbility实例的上下文
let context = this.context;
...
}
}
// 在页面中获取UIAbility实例的上下文信息
import common from '@ohos.app.ability.common';
@Entry
@Component
struct Index {
// getContext(this) 返回的是Context
private context = getContext(this) as common.UIAbilityContext;
}
- 获取ApplicationContext,应用级别的Context。
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let applicationContext = this.context.getApplicationContext();
...
}
}
3、共享包:HSP、HAR
- HAR(Harmony Archive)静态共享包
- HSP(Harmony Shared Package)动态共享包
- 区别
HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝
HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份
- HSP旨在解决HAR存在的几个问题
多个HAP引用相同的HAR,导致的APP包大小膨胀问题。
多个HAP引用相同的HAR,HAR中的一些状态变量无法共享的问题。
4、装饰器
- 【自定义组件】相关装饰器
@Builder装饰器:自定义构建函数(组件内、全局)
@BuilderParam装饰器:引用@Builder函数
wrapBuilder:封装全局@Builder
@Styles装饰器:定义组件重用样式(组件内、全局)
@Extend装饰器:定义扩展组件样式(仅支持在全局定义)
stateStyles:多态样式
@AnimatableExtend装饰器:定义可动画属性(仅支持定义在全局),让不可动画属性具有动画属性
@Require装饰器:校验构造传参
- 【组件】状态相关装饰器
@State装饰器:组件内状态
@Prop装饰器:父子单向同步
@Link装饰器:父子双向同步
@Provide装饰器和@Consume装饰器:与后代组件双向同步
@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
- 【应用】状态相关装饰器
LocalStorage:页面级UI状态存储
AppStorage:应用全局的UI状态存储
PersistentStorage:持久化存储UI状态
Environment:设备环境查询
- 其他状态相关装饰器
@Watch装饰器:状态变量更改通知
$$语法:内置组件双向同步
@Track装饰器:class对象属性级更新
@Concurrent装饰器:校验并发函数(使用TaskPool时,用到)
5、生命周期
6、路由
7、数据管理技术
8、并发问题
9、API
10、卡片
11、性能优化
- 布局性能提升
1、使用Column/Row代替Flex。
2、大小不需要变更的子组件主动设置flexShrink属性值为0。
3、优先使用layoutWeight属性替代flexGrow属性和flexShrink属性。
4、子组件主轴长度分配设置为最常用场景的布局结果,使子组件主轴长度总和等于Flex容器主轴长度。
- 设置List组件的宽高
在使用Scroll容器组件嵌套List组件加载长列表时,若不指定List的宽高尺寸,则默认全部加载。
Scroll嵌套List时:
1、List没有设置宽高,会布局List的所有子组件。
2、List设置宽高,会布局List显示区域内的子组件。
3、List使用ForEach加载子组件时,无论是否设置List的宽高,都会加载所有子组件。
4、List使用LazyForEach加载子组件时,没有设置List的宽高,会加载所有子组件,设置了List的宽高,会加载List显示区域内的子组件。
- 使用显隐控制替代条件渲染
可使用visibility通用属性控制组件的显隐状态时代替if条件渲染,其中Hidden性能最优,其次是None
- 减少应用滑动白块
1、应用通过增大List/Grid控件的cachedCount参数,调整UI的加载范围。cachedCount表示屏幕外List/Grid预加载item的个数。
2、如果需要请求网络图片,可以在item滑动到屏幕显示之前,提前下载好内容,从而减少滑动白块。
- 合理使用ForEach/LazyForEach
1、减少使用LazyForEach的重建机制刷新UI【通过@Observed和@ObjectLink配合,代替reloadData()】
2、ForEach遍历使用key值提升性能
3、在ForEach中使用自定义组件搭配对象数组
- 使用@ObjectLink代替@Prop减少不必要的深拷贝
- 不使用状态变量强行更新非状态变量关联组件
- 精准控制状态变量关联的组件数
- 避免在for、while等循环逻辑中频繁读取状态变量